Use attribute_metaclass in the constructor for parameters_metaclass, and
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized / Meta / Role / Parameterizable.pm
index 584382a..c72c405 100644 (file)
@@ -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,31 +32,47 @@ 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 $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->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,
     );
@@ -66,8 +89,30 @@ sub apply {
     $role->apply($class, %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<Moose/with>,
+but instead of composing the parameteriz-able role, we construct a new
+parameteriz-ed role
+(L<MooseX::Role::Parameterized::Meta::Role::Parameterized>).
+
+=cut
+