Add role_for_combination to fix prole-role combination
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized / Meta / Role / Parameterizable.pm
index a7c7e58..59529ee 100644 (file)
@@ -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 parameter_metaclass => (
+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,
         );
     },
 );
@@ -32,11 +38,11 @@ sub add_parameter {
         if !defined($name);
 
     # need to figure out a plan for these guys..
-    confess "The parameter name ($name) is currently forbidden."
+    confess "The parameter name ($name) is currently forbidden"
         if $name eq 'alias'
         || $name eq 'excludes';
 
-    $self->parameter_metaclass->add_attribute($name => @_);
+    $self->parameters_metaclass->add_attribute($name => @_);
 }
 
 sub construct_parameters {
@@ -45,18 +51,20 @@ sub construct_parameters {
 
     # need to figure out a plan for these guys..
     for my $name ('alias', 'excludes') {
-        confess "The parameter name ($name) is currently forbidden."
+        confess "The parameter name ($name) is currently forbidden"
             if exists $args{$name};
     }
 
-    $self->parameter_metaclass->new_object(\%args);
+    $self->parameters_metaclass->new_object(\%args);
 }
 
 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 {