Move the eval_environment wrapper to the Class trait from Constructor
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor / Trait / Class.pm
index f4c106a..f032fe5 100644 (file)
@@ -6,7 +6,33 @@ use namespace::autoclean;
 
 use B ();
 
-around '_inline_BUILDALL' => sub {
+around new_object => sub {
+    my $orig     = shift;
+    my $self     = shift;
+    my $params   = @_ == 1 ? $_[0] : {@_};
+    my $instance = $self->$orig(@_);
+
+    my %attrs = (
+        __INSTANCE__ => 1,
+        (
+            map { $_ => 1 }
+            grep {defined}
+            map  { $_->init_arg() } $self->get_all_attributes()
+        )
+    );
+
+    my @bad = sort grep { !$attrs{$_} } keys %$params;
+
+    if (@bad) {
+        $self->throw_error(
+            "Found unknown attribute(s) init_arg passed to the constructor: @bad"
+        );
+    }
+
+    return $instance;
+};
+
+around _inline_BUILDALL => sub {
     my $orig = shift;
     my $self = shift;
 
@@ -21,26 +47,30 @@ 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");',
         '}',
     );
-};
+} if $Moose::VERSION >= 1.9900;
 
-# If the base class role is applied first, and then a superclass is added, we
-# lose the role.
-after superclasses => sub {
+around _eval_environment => sub {
+    my $orig = shift;
     my $self = shift;
 
-    return unless @_;
+    my $env = $self->$orig();
 
-    Moose::Util::MetaRole::apply_base_class_roles(
-        for   => $self->name,
-        roles => ['MooseX::StrictConstructor::Role::Object'],
-    );
-};
+    my %attrs = map { $_ => 1 }
+        grep { defined }
+        map  { $_->init_arg() }
+        $self->get_all_attributes();
+
+    $attrs{__INSTANCE__} = 1;
+
+    $env->{'%allowed_attrs'} = \%attrs;
+
+    return $env;
+} if $Moose::VERSION >= 1.9900;
 
 1;