1 package MooseX::Role::Parameterized::Meta::Role::Parameterizable;
3 extends 'Moose::Meta::Role';
5 # ABSTRACT: metaclass for parameterizable roles
7 use MooseX::Role::Parameterized::Meta::Role::Parameterized;
8 use MooseX::Role::Parameterized::Parameters;
10 use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
12 has parameter_metaclass => (
14 isa => 'Moose::Meta::Class',
17 Moose::Meta::Class->create_anon_class(
18 superclasses => ['MooseX::Role::Parameterized::Parameters'],
23 has role_generator => (
26 predicate => 'has_role_generator',
33 # need to figure out a plan for these guys..
34 confess "The parameter name ($name) is currently forbidden."
36 || $name eq 'excludes';
38 $self->parameter_metaclass->add_attribute($name => @_);
41 sub construct_parameters {
45 # need to figure out a plan for these guys..
46 for my $name ('alias', 'excludes') {
47 confess "The parameter name ($name) is currently forbidden."
48 if exists $args{$name};
51 $self->parameter_metaclass->new_object(\%args);
57 my $parameters = @_ == 1 ? shift
58 : $self->construct_parameters(@_);
60 confess "A role generator is required to generate roles"
61 unless $self->has_role_generator;
63 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
65 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
66 $self->role_generator->($parameters,
67 operating_on => $role,
78 my $role = $self->generate_role(%args);
79 $role->apply($class, %args);
82 __PACKAGE__->meta->make_immutable;