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::Parameters;
8 use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
10 has parameter_metaclass => (
12 isa => 'Moose::Meta::Class',
15 Moose::Meta::Class->create_anon_class(
16 superclasses => ['MooseX::Role::Parameterized::Parameters'],
21 has role_generator => (
24 predicate => 'has_role_generator',
31 confess "You must provide a name for the parameter"
34 # need to figure out a plan for these guys..
35 confess "The parameter name ($name) is currently forbidden."
37 || $name eq 'excludes';
39 $self->parameter_metaclass->add_attribute($name => @_);
42 sub construct_parameters {
46 # need to figure out a plan for these guys..
47 for my $name ('alias', 'excludes') {
48 confess "The parameter name ($name) is currently forbidden."
49 if exists $args{$name};
52 $self->parameter_metaclass->new_object(\%args);
58 my $parameters = @_ == 1 ? shift
59 : $self->construct_parameters(@_);
61 confess "A role generator is required to generate roles"
62 unless $self->has_role_generator;
64 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
66 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
68 $self->apply_parameterizable_role($role);
70 $self->role_generator->($parameters,
71 operating_on => $role,
82 my $role = $self->generate_role(%args);
83 $role->apply($class, %args);
86 sub apply_parameterizable_role {
89 $self->SUPER::apply(@_);
92 __PACKAGE__->meta->make_immutable;
101 MooseX::Role::Parameterized::Meta::Role::Parameterizable - metaclass for parameterizable roles
105 This is the metaclass for parameteriz-able roles, roles that have their
106 parameters currently unbound. These are the roles that you use L<Moose/with>,
107 but instead of composing the parameteriz-able role, we construct a new
109 (L<MooseX::Role::Parameterized::Meta::Role::Parameterized>).