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