redo constructor class as a role too
Dave Rolsky [Thu, 21 Aug 2008 15:43:12 +0000 (15:43 +0000)]
lib/MooseX/StrictConstructor/Role/Constructor.pm [moved from lib/MooseX/StrictConstructor/Meta/Method/Constructor.pm with 85% similarity]
lib/MooseX/StrictConstructor/Role/Metaclass.pm

@@ -1,18 +1,18 @@
-package MooseX::StrictConstructor::Meta::Method::Constructor;
+package MooseX::StrictConstructor::Role::Constructor;
 
 use strict;
 use warnings;
 
 use Carp ();
-use Moose;
 
-extends 'Moose::Meta::Method::Constructor';
+use Moose::Role;
 
-override '_generate_BUILDALL' => sub
+around '_generate_BUILDALL' => sub
 {
+    my $orig = shift;
     my $self = shift;
 
-    my $source = super();
+    my $source = $self->$orig();
     $source .= ";\n" if $source;
 
     my @attrs =
@@ -35,8 +35,7 @@ EOF
     return $source;
 };
 
-no Moose;
-
+no Moose::Role;
 
 1;
 
index d2c0239..e96b981 100644 (file)
@@ -7,7 +7,24 @@ use MooseX::StrictConstructor::Meta::Method::Constructor;
 
 use Moose::Role;
 
+has 'constructor_class' =>
+    ( is         => 'ro',
+      isa        => 'ClassName',
+      lazy_build => 1,
+    );
 
+sub _build_constructor_class
+{
+    return
+        Moose::Meta::Class->create_anon_class
+            ( superclasses => [ 'Moose::Meta::Method::Constructor' ],
+              roles        => [ 'MooseX::StrictConstructor::Role::Constructor' ],
+              cache        => 1,
+            )->name();
+}
+
+# If Moose::Meta::Class had a constructor_class attribute, this
+# wrapper would not be necessary.
 around 'make_immutable' => sub
 {
     my $orig = shift;
@@ -15,7 +32,7 @@ around 'make_immutable' => sub
 
     return
         $self->$orig
-            ( constructor_class => 'MooseX::StrictConstructor::Meta::Method::Constructor',
+            ( constructor_class => $self->constructor_class(),
               @_,
             );
 };