Rename parameter_metaclass to parameters_metaclass
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized / Meta / Role / Parameterizable.pm
CommitLineData
d93bd54d 1package MooseX::Role::Parameterized::Meta::Role::Parameterizable;
7b42fc96 2use Moose;
3extends 'Moose::Meta::Role';
4
8f9a5c92 5use MooseX::Role::Parameterized::Meta::Role::Parameterized;
7b42fc96 6use MooseX::Role::Parameterized::Parameters;
7
533553a0 8use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
9
f8f36548 10has parameters_metaclass => (
39d3d5d0 11 is => 'rw',
f563c3cd 12 isa => 'Moose::Meta::Class',
13 lazy => 1,
14 default => sub {
15 Moose::Meta::Class->create_anon_class(
16 superclasses => ['MooseX::Role::Parameterized::Parameters'],
17 );
18 },
19);
20
5b82ffb1 21has role_generator => (
22 is => 'rw',
23 isa => 'CodeRef',
24 predicate => 'has_role_generator',
25);
26
f563c3cd 27sub add_parameter {
28 my $self = shift;
21c3ef8c 29 my $name = shift;
30
396466d4 31 confess "You must provide a name for the parameter"
32 if !defined($name);
33
21c3ef8c 34 # need to figure out a plan for these guys..
e039cb6c 35 confess "The parameter name ($name) is currently forbidden"
21c3ef8c 36 if $name eq 'alias'
37 || $name eq 'excludes';
38
f8f36548 39 $self->parameters_metaclass->add_attribute($name => @_);
f563c3cd 40}
7b42fc96 41
f74750fb 42sub construct_parameters {
43 my $self = shift;
21c3ef8c 44 my %args = @_;
45
46 # need to figure out a plan for these guys..
47 for my $name ('alias', 'excludes') {
e039cb6c 48 confess "The parameter name ($name) is currently forbidden"
21c3ef8c 49 if exists $args{$name};
50 }
51
f8f36548 52 $self->parameters_metaclass->new_object(\%args);
f74750fb 53}
54
4534bdce 55sub generate_role {
56 my $self = shift;
58954f3e 57
58 my $parameters = @_ == 1 ? shift
59 : $self->construct_parameters(@_);
4534bdce 60
61 confess "A role generator is required to generate roles"
62 unless $self->has_role_generator;
63
533553a0 64 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
4534bdce 65
884a2a3b 66 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
563f6b7c 67
4a2212da 68 $self->apply_parameterizable_role($role);
563f6b7c 69
1e750b62 70 $self->role_generator->($parameters,
884a2a3b 71 operating_on => $role,
1e750b62 72 );
4534bdce 73
1e750b62 74 return $role;
4534bdce 75}
76
d872e120 77sub apply {
78 my $self = shift;
79 my $class = shift;
80 my %args = @_;
81
82 my $role = $self->generate_role(%args);
83 $role->apply($class, %args);
84}
85
4a2212da 86sub apply_parameterizable_role {
563f6b7c 87 my $self = shift;
88
89 $self->SUPER::apply(@_);
90}
91
7b42fc96 92__PACKAGE__->meta->make_immutable;
93no Moose;
94
951;
96
09e02a3f 97__END__
98
30788701 99=head1 NAME
100
101MooseX::Role::Parameterized::Meta::Role::Parameterizable - metaclass for parameterizable roles
102
09e02a3f 103=head1 DESCRIPTION
104
105This is the metaclass for parameteriz-able roles, roles that have their
106parameters currently unbound. These are the roles that you use L<Moose/with>,
107but instead of composing the parameteriz-able role, we construct a new
108parameteriz-ed role
109(L<MooseX::Role::Parameterized::Meta::Role::Parameterized>).
110
111=cut
112