X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMooseX-StrictConstructor.git;a=blobdiff_plain;f=lib%2FMooseX%2FStrictConstructor%2FTrait%2FClass.pm;h=f032fe535811432d09fa55399ccb1a25b0116cce;hp=0c73318f84c77755798e648490df078e3e9ac62d;hb=f00a034fe06bd519d9f64f2f942d4ff402d0ae87;hpb=714128ef886ae4a37d5aefe6910a7581150ec149 diff --git a/lib/MooseX/StrictConstructor/Trait/Class.pm b/lib/MooseX/StrictConstructor/Trait/Class.pm index 0c73318..f032fe5 100644 --- a/lib/MooseX/StrictConstructor/Trait/Class.pm +++ b/lib/MooseX/StrictConstructor/Trait/Class.pm @@ -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,13 +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; + +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;