1 package MooseX::Role::Parameterized::Meta::Role::Parameterizable;
3 extends 'Moose::Meta::Role';
5 use MooseX::Role::Parameterized::Meta::Role::Parameterized;
6 use MooseX::Role::Parameterized::Meta::Parameter;
7 use MooseX::Role::Parameterized::Parameters;
9 use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
10 use constant parameter_metaclass => 'MooseX::Role::Parameterized::Meta::Parameter';
11 use constant parameters_class => 'MooseX::Role::Parameterized::Parameters';
13 has parameters_metaclass => (
15 isa => 'Moose::Meta::Class',
20 $self->parameters_class->meta->create_anon_class(
21 superclasses => [$self->parameters_class],
22 attribute_metaclass => $self->parameter_metaclass,
27 has role_generator => (
30 predicate => 'has_role_generator',
37 confess "You must provide a name for the parameter"
40 # need to figure out a plan for these guys..
41 confess "The parameter name ($name) is currently forbidden"
43 || $name eq 'excludes';
45 $self->parameters_metaclass->add_attribute($name => @_);
48 sub construct_parameters {
52 # need to figure out a plan for these guys..
53 for my $name ('alias', 'excludes') {
54 confess "The parameter name ($name) is currently forbidden"
55 if exists $args{$name};
58 $self->parameters_metaclass->new_object(\%args);
65 my $parameters = blessed($args{parameters})
67 : $self->construct_parameters(%{ $args{parameters} });
69 confess "A role generator is required to generate roles"
70 unless $self->has_role_generator;
72 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
74 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
76 $self->apply_parameterizable_role($role);
78 $self->role_generator->($parameters,
79 operating_on => $role,
80 consumer => $args{consumer},
86 sub _role_for_combination {
88 my $parameters = shift;
90 return $self->generate_role(
91 parameters => $parameters,
100 my $role = $self->generate_role(
101 consumer => $consumer,
102 parameters => \%args,
105 $role->apply($consumer, %args);
108 sub apply_parameterizable_role {
111 $self->SUPER::apply(@_);
114 __PACKAGE__->meta->make_immutable;
123 MooseX::Role::Parameterized::Meta::Role::Parameterizable - metaclass for parameterizable roles
127 This is the metaclass for parameteriz-able roles, roles that have their
128 parameters currently unbound. These are the roles that you use L<Moose/with>,
129 but instead of composing the parameteriz-able role, we construct a new
131 (L<MooseX::Role::Parameterized::Meta::Role::Parameterized>).