Use method_metaclass; the other hardcoded classnames are easily overridden or fleeting
[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
f563c3cd 9has parameter_metaclass => (
39d3d5d0 10 is => 'rw',
f563c3cd 11 isa => 'Moose::Meta::Class',
12 lazy => 1,
13 default => sub {
14 Moose::Meta::Class->create_anon_class(
15 superclasses => ['MooseX::Role::Parameterized::Parameters'],
16 );
17 },
18);
19
5b82ffb1 20has role_generator => (
21 is => 'rw',
22 isa => 'CodeRef',
23 predicate => 'has_role_generator',
24);
25
f563c3cd 26sub add_parameter {
27 my $self = shift;
28 $self->parameter_metaclass->add_attribute(@_);
29}
7b42fc96 30
f74750fb 31sub construct_parameters {
32 my $self = shift;
1adb2fea 33 $self->parameter_metaclass->new_object(@_);
f74750fb 34}
35
4534bdce 36sub generate_role {
37 my $self = shift;
38 my %args = @_;
39
40 confess "A role generator is required to generate roles"
41 unless $self->has_role_generator;
42
8f9a5c92 43 my $parameters = $self->construct_parameters(%args);
44
1e750b62 45 my $metaclass = Moose::Meta::Class->create_anon_class(
8f9a5c92 46 superclasses => ['MooseX::Role::Parameterized::Meta::Role::Parameterized'],
47 );
1adb2fea 48 my $role = $metaclass->new_object(
8f9a5c92 49 parameters => $parameters,
4534bdce 50 );
4534bdce 51
884a2a3b 52 local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
1e750b62 53 $self->role_generator->($parameters,
884a2a3b 54 operating_on => $role,
1e750b62 55 );
4534bdce 56
1e750b62 57 return $role;
4534bdce 58}
59
d872e120 60sub apply {
61 my $self = shift;
62 my $class = shift;
63 my %args = @_;
64
65 my $role = $self->generate_role(%args);
66 $role->apply($class, %args);
67}
68
7b42fc96 69__PACKAGE__->meta->make_immutable;
70no Moose;
71
721;
73