Remove #!/usr/bin/env perl
[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
f563c3cd 10has parameter_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
31 # need to figure out a plan for these guys..
32 confess "The parameter name ($name) is currently forbidden."
33 if $name eq 'alias'
34 || $name eq 'excludes';
35
36 $self->parameter_metaclass->add_attribute($name => @_);
f563c3cd 37}
7b42fc96 38
f74750fb 39sub construct_parameters {
40 my $self = shift;
21c3ef8c 41 my %args = @_;
42
43 # need to figure out a plan for these guys..
44 for my $name ('alias', 'excludes') {
45 confess "The parameter name ($name) is currently forbidden."
46 if exists $args{$name};
47 }
48
49 $self->parameter_metaclass->new_object(\%args);
f74750fb 50}
51
4534bdce 52sub generate_role {
53 my $self = shift;
58954f3e 54
55 my $parameters = @_ == 1 ? shift
56 : $self->construct_parameters(@_);
4534bdce 57
58 confess "A role generator is required to generate roles"
59 unless $self->has_role_generator;
60
533553a0 61 my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
4534bdce 62
884a2a3b 63 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
1e750b62 64 $self->role_generator->($parameters,
884a2a3b 65 operating_on => $role,
1e750b62 66 );
4534bdce 67
1e750b62 68 return $role;
4534bdce 69}
70
d872e120 71sub apply {
72 my $self = shift;
73 my $class = shift;
74 my %args = @_;
75
76 my $role = $self->generate_role(%args);
77 $role->apply($class, %args);
78}
79
7b42fc96 80__PACKAGE__->meta->make_immutable;
81no Moose;
82
831;
84