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=c6865c695c94c7377bc4d713ef54622912fbbb15;hb=f00a034fe06bd519d9f64f2f942d4ff402d0ae87;hpb=7d51074a04f1ed362e74ff1cb5ac781a6db5df6d diff --git a/lib/MooseX/StrictConstructor/Trait/Class.pm b/lib/MooseX/StrictConstructor/Trait/Class.pm index c6865c6..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,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;