Allow passing in an already constructed parameter object
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized / Meta / Role / Parameterizable.pm
index 9fd9b76..6aa19de 100644 (file)
@@ -6,6 +6,8 @@ extends 'Moose::Meta::Role';
 use MooseX::Role::Parameterized::Meta::Role::Parameterized;
 use MooseX::Role::Parameterized::Parameters;
 
+use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
+
 has parameter_metaclass => (
     is      => 'rw',
     isa     => 'Moose::Meta::Class',
@@ -30,24 +32,19 @@ sub add_parameter {
 
 sub construct_parameters {
     my $self = shift;
-    $self->parameter_metaclass->construct_instance(@_);
+    $self->parameter_metaclass->new_object(@_);
 }
 
 sub generate_role {
     my $self = shift;
-    my %args = @_;
+
+    my $parameters = @_ == 1 ? shift
+                             : $self->construct_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->construct_instance(
-        parameters => $parameters,
-    );
+    my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
 
     local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
     $self->role_generator->($parameters,
@@ -57,6 +54,15 @@ sub generate_role {
     return $role;
 }
 
+sub apply {
+    my $self  = shift;
+    my $class = shift;
+    my %args  = @_;
+
+    my $role = $self->generate_role(%args);
+    $role->apply($class, %args);
+}
+
 __PACKAGE__->meta->make_immutable;
 no Moose;