use namespace::autoclean;
use B ();
-use Carp ();
-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;
return (
@source,
- 'my %attrs = (' . ( join ' ', @attrs ) . ');',
- 'my @bad = sort grep { !$attrs{$_} } keys %{ $params };',
+ 'my @bad = sort grep { !$allowed_attrs{$_} } keys %{ $params };',
'if (@bad) {',
- 'Carp::confess "Found unknown attribute(s) passed to the constructor: @bad";',
+ 'Moose->throw_error("Found unknown attribute(s) passed to the constructor: @bad");',
'}',
);
-};
+} 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->get_all_attributes();
+
+ $attrs{__INSTANCE__} = 1;
+
+ $env->{'%allowed_attrs'} = \%attrs;
+
+ return $env;
+} if $Moose::VERSION >= 1.9900;
1;