Abstracts
[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
d9e02904 5# ABSTRACT: metaclass for parameterizable roles
6
8f9a5c92 7use MooseX::Role::Parameterized::Meta::Role::Parameterized;
7b42fc96 8use MooseX::Role::Parameterized::Parameters;
9
533553a0 10use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
11
f563c3cd 12has parameter_metaclass => (
39d3d5d0 13 is => 'rw',
f563c3cd 14 isa => 'Moose::Meta::Class',
15 lazy => 1,
16 default => sub {
17 Moose::Meta::Class->create_anon_class(
18 superclasses => ['MooseX::Role::Parameterized::Parameters'],
19 );
20 },
21);
22
5b82ffb1 23has role_generator => (
24 is => 'rw',
25 isa => 'CodeRef',
26 predicate => 'has_role_generator',
27);
28
f563c3cd 29sub add_parameter {
30 my $self = shift;
21c3ef8c 31 my $name = shift;
32
33 # need to figure out a plan for these guys..
34 confess "The parameter name ($name) is currently forbidden."
35 if $name eq 'alias'
36 || $name eq 'excludes';
37
38 $self->parameter_metaclass->add_attribute($name => @_);
f563c3cd 39}
7b42fc96 40
f74750fb 41sub construct_parameters {
42 my $self = shift;
21c3ef8c 43 my %args = @_;
44
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};
49 }
50
51 $self->parameter_metaclass->new_object(\%args);
f74750fb 52}
53
4534bdce 54sub generate_role {
55 my $self = shift;
58954f3e 56
57 my $parameters = @_ == 1 ? shift
58 : $self->construct_parameters(@_);
4534bdce 59
60 confess "A role generator is required to generate roles"
61 unless $self->has_role_generator;
62
533553a0 63 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
4534bdce 64
884a2a3b 65 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
1e750b62 66 $self->role_generator->($parameters,
884a2a3b 67 operating_on => $role,
1e750b62 68 );
4534bdce 69
1e750b62 70 return $role;
4534bdce 71}
72
d872e120 73sub apply {
74 my $self = shift;
75 my $class = shift;
76 my %args = @_;
77
78 my $role = $self->generate_role(%args);
79 $role->apply($class, %args);
80}
81
7b42fc96 82__PACKAGE__->meta->make_immutable;
83no Moose;
84
851;
86