When inlining with Moose 2.0+, close over hash of allowed attrs rather than regenerat...
Dave Rolsky [Wed, 4 Jan 2012 06:50:37 +0000 (00:50 -0600)]
lib/MooseX/StrictConstructor.pm
lib/MooseX/StrictConstructor/Trait/Class.pm
lib/MooseX/StrictConstructor/Trait/Method/Constructor.pm

index 030230f..b45c3f0 100644 (file)
@@ -7,19 +7,16 @@ use Moose 0.94 ();
 use Moose::Exporter;
 use Moose::Util::MetaRole;
 
-{
-    my %class_meta = ( class => ['MooseX::StrictConstructor::Trait::Class'] );
-
-    if ( $Moose::VERSION < 1.9900 ) {
-        require MooseX::StrictConstructor::Trait::Method::Constructor;
-        $class_meta{constructor}
-            = ['MooseX::StrictConstructor::Trait::Method::Constructor'];
-    }
-
-    Moose::Exporter->setup_import_methods(
-        class_metaroles => \%class_meta,
-    );
-}
+use MooseX::StrictConstructor::Trait::Class;
+use MooseX::StrictConstructor::Trait::Method::Constructor;;
+
+Moose::Exporter->setup_import_methods(
+    class_metaroles => {
+        class => ['MooseX::StrictConstructor::Trait::Class'],
+        constructor =>
+            ['MooseX::StrictConstructor::Trait::Method::Constructor'],
+    },
+);
 
 1;
 
index 707c75f..b96e5fd 100644 (file)
@@ -47,8 +47,7 @@ around '_inline_BUILDALL' => sub {
 
     return (
         @source,
-        'my %attrs = (' . ( join ' ', @attrs ) . ');',
-        'my @bad = sort grep { !$attrs{$_} } keys %{ $params };',
+        'my @bad = sort grep { !$allowed_attrs{$_} } keys %{ $params };',
         'if (@bad) {',
             'Moose->throw_error("Found unknown attribute(s) passed to the constructor: @bad");',
         '}',
index 0ceec12..ae5d3fb 100644 (file)
@@ -31,7 +31,25 @@ if (\@bad) {
 EOF
 
     return $source;
-};
+} if $Moose::VERSION < 1.9900;
+
+around _eval_environment => sub {
+    my $orig = shift;
+    my $self = shift;
+
+    my $env = $self->$orig();
+
+    my %attrs = map { $_ => 1 }
+        grep { defined }
+        map  { $_->init_arg() }
+        $self->associated_metaclass()->get_all_attributes();
+
+    $attrs{__INSTANCE__} = 1;
+
+    $env->{'%allowed_attrs'} = \%attrs;
+
+    return $env;
+} if $Moose::VERSION >= 1.9900;
 
 1;