X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FRole%2FParameterized%2FMeta%2FRole%2FParameterizable.pm;h=2574437c82106259e375e9aa4a01fd008404f6df;hb=51e9880c4f3c538ecd99d402096ccfbd2dc850d5;hp=b66d86e8e347034e84c18703a2f5c51de57ef2f4;hpb=f8f365484c40dd9778eb8611a0764857641831e1;p=gitmo%2FMooseX-Role-Parameterized.git diff --git a/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm b/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm index b66d86e..2574437 100644 --- a/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm +++ b/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm @@ -3,17 +3,23 @@ use Moose; extends 'Moose::Meta::Role'; use MooseX::Role::Parameterized::Meta::Role::Parameterized; +use MooseX::Role::Parameterized::Meta::Parameter; use MooseX::Role::Parameterized::Parameters; use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized'; +use constant parameter_metaclass => 'MooseX::Role::Parameterized::Meta::Parameter'; +use constant parameters_class => 'MooseX::Role::Parameterized::Parameters'; has parameters_metaclass => ( is => 'rw', isa => 'Moose::Meta::Class', lazy => 1, default => sub { - Moose::Meta::Class->create_anon_class( - superclasses => ['MooseX::Role::Parameterized::Parameters'], + my $self = shift; + + $self->parameters_class->meta->create_anon_class( + superclasses => [$self->parameters_class], + attribute_metaclass => $self->parameter_metaclass, ); }, ); @@ -53,10 +59,12 @@ sub construct_parameters { } sub generate_role { - my $self = shift; + my $self = shift; + my %args = @_; - my $parameters = @_ == 1 ? shift - : $self->construct_parameters(@_); + my $parameters = blessed($args{parameters}) + ? $args{parameters} + : $self->construct_parameters(%{ $args{parameters} }); confess "A role generator is required to generate roles" unless $self->has_role_generator; @@ -69,18 +77,32 @@ sub generate_role { $self->role_generator->($parameters, operating_on => $role, + consumer => $args{consumer}, ); return $role; } +sub _role_for_combination { + my $self = shift; + my $parameters = shift; + + return $self->generate_role( + parameters => $parameters, + ); +} + sub apply { - my $self = shift; - my $class = shift; - my %args = @_; + my $self = shift; + my $consumer = shift; + my %args = @_; + + my $role = $self->generate_role( + consumer => $consumer, + parameters => \%args, + ); - my $role = $self->generate_role(%args); - $role->apply($class, %args); + $role->apply($consumer, %args); } sub apply_parameterizable_role {