2 package MooseX::Role::Parameterized::Meta::Role::Parameterizable;
4 extends 'Moose::Meta::Role';
6 use MooseX::Role::Parameterized::Meta::Role::Parameterized;
7 use MooseX::Role::Parameterized::Parameters;
9 use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
11 has parameter_metaclass => (
13 isa => 'Moose::Meta::Class',
16 Moose::Meta::Class->create_anon_class(
17 superclasses => ['MooseX::Role::Parameterized::Parameters'],
22 has role_generator => (
25 predicate => 'has_role_generator',
30 $self->parameter_metaclass->add_attribute(@_);
33 sub construct_parameters {
35 $self->parameter_metaclass->new_object(@_);
41 my $parameters = @_ == 1 ? shift
42 : $self->construct_parameters(@_);
44 confess "A role generator is required to generate roles"
45 unless $self->has_role_generator;
47 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
49 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
50 $self->role_generator->($parameters,
51 operating_on => $role,
62 my $role = $self->generate_role(%args);
63 $role->apply($class, %args);
66 __PACKAGE__->meta->make_immutable;