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 has parameter_metaclass => (
11 isa => 'Moose::Meta::Class',
14 Moose::Meta::Class->create_anon_class(
15 superclasses => ['MooseX::Role::Parameterized::Parameters'],
20 has role_generator => (
23 predicate => 'has_role_generator',
28 $self->parameter_metaclass->add_attribute(@_);
31 sub construct_parameters {
33 $self->parameter_metaclass->new_object(@_);
40 confess "A role generator is required to generate roles"
41 unless $self->has_role_generator;
43 my $parameters = $self->construct_parameters(%args);
45 my $metaclass = Moose::Meta::Class->create_anon_class(
46 superclasses => ['MooseX::Role::Parameterized::Meta::Role::Parameterized'],
48 my $role = $metaclass->new_object(
49 parameters => $parameters,
52 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
53 $self->role_generator->($parameters,
54 operating_on => $role,
65 my $role = $self->generate_role(%args);
66 $role->apply($class, %args);
69 __PACKAGE__->meta->make_immutable;