We don't need the metametaclass, we just want to operate on the metaclass
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized / Meta / Role.pm
CommitLineData
7b42fc96 1#!/usr/bin/env perl
2package MooseX::Role::Parameterized::Meta::Role;
3use Moose;
4extends 'Moose::Meta::Role';
5
6use MooseX::Role::Parameterized::Parameters;
7
f563c3cd 8has parameter_metaclass => (
39d3d5d0 9 is => 'rw',
f563c3cd 10 isa => 'Moose::Meta::Class',
11 lazy => 1,
12 default => sub {
13 Moose::Meta::Class->create_anon_class(
14 superclasses => ['MooseX::Role::Parameterized::Parameters'],
15 );
16 },
17);
18
5b82ffb1 19has role_generator => (
20 is => 'rw',
21 isa => 'CodeRef',
22 predicate => 'has_role_generator',
23);
24
f563c3cd 25sub add_parameter {
26 my $self = shift;
27 $self->parameter_metaclass->add_attribute(@_);
28}
7b42fc96 29
f74750fb 30sub construct_parameters {
31 my $self = shift;
32 $self->parameter_metaclass->construct_instance(@_);
33}
34
4534bdce 35sub generate_role {
36 my $self = shift;
37 my %args = @_;
38
39 confess "A role generator is required to generate roles"
40 unless $self->has_role_generator;
41
1e750b62 42 my $metaclass = Moose::Meta::Class->create_anon_class(
4534bdce 43 superclasses => ['Moose::Meta::Role'],
44 );
884a2a3b 45 my $role = $metaclass->construct_instance;
4534bdce 46
47 my $parameters = $self->construct_parameters(%args);
48
884a2a3b 49 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
1e750b62 50 $self->role_generator->($parameters,
884a2a3b 51 operating_on => $role,
1e750b62 52 );
4534bdce 53
1e750b62 54 return $role;
4534bdce 55}
56
7b42fc96 57__PACKAGE__->meta->make_immutable;
58no Moose;
59
601;
61