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=a7cbe8d6d881ae5cb31a574cab560117cc7c830a;hpb=1adb2feae5763e11428daacaf429ea993adcc3d9;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 a7cbe8d..2574437 100644 --- a/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm +++ b/lib/MooseX/Role/Parameterized/Meta/Role/Parameterizable.pm @@ -1,18 +1,25 @@ -#!/usr/bin/env perl package MooseX::Role::Parameterized::Meta::Role::Parameterizable; use Moose; extends 'Moose::Meta::Role'; use MooseX::Role::Parameterized::Meta::Role::Parameterized; +use MooseX::Role::Parameterized::Meta::Parameter; use MooseX::Role::Parameterized::Parameters; -has parameter_metaclass => ( +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, ); }, ); @@ -25,40 +32,103 @@ has role_generator => ( sub add_parameter { my $self = shift; - $self->parameter_metaclass->add_attribute(@_); + my $name = shift; + + confess "You must provide a name for the parameter" + if !defined($name); + + # need to figure out a plan for these guys.. + confess "The parameter name ($name) is currently forbidden" + if $name eq 'alias' + || $name eq 'excludes'; + + $self->parameters_metaclass->add_attribute($name => @_); } sub construct_parameters { my $self = shift; - $self->parameter_metaclass->new_object(@_); + my %args = @_; + + # need to figure out a plan for these guys.. + for my $name ('alias', 'excludes') { + confess "The parameter name ($name) is currently forbidden" + if exists $args{$name}; + } + + $self->parameters_metaclass->new_object(\%args); } sub generate_role { - my $self = shift; - my %args = @_; + my $self = shift; + my %args = @_; + + 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; - my $parameters = $self->construct_parameters(%args); - - my $metaclass = Moose::Meta::Class->create_anon_class( - superclasses => ['MooseX::Role::Parameterized::Meta::Role::Parameterized'], - ); - my $role = $metaclass->new_object( - parameters => $parameters, - ); + my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters); local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role; + + $self->apply_parameterizable_role($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 $consumer = shift; + my %args = @_; + + my $role = $self->generate_role( + consumer => $consumer, + parameters => \%args, + ); + + $role->apply($consumer, %args); +} + +sub apply_parameterizable_role { + my $self = shift; + + $self->SUPER::apply(@_); +} + __PACKAGE__->meta->make_immutable; no Moose; 1; +__END__ + +=head1 NAME + +MooseX::Role::Parameterized::Meta::Role::Parameterizable - metaclass for parameterizable roles + +=head1 DESCRIPTION + +This is the metaclass for parameteriz-able roles, roles that have their +parameters currently unbound. These are the roles that you use L, +but instead of composing the parameteriz-able role, we construct a new +parameteriz-ed role +(L). + +=cut +