X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStrictConstructor%2FTrait%2FClass.pm;h=3d0f9a019a548171e1340468e6c13ea0772c2708;hb=4e914932a13aae9de6694fa6fca713404b7809db;hp=707c75fc187a89c4d882a5d87f28e51e3fd9cac4;hpb=eb63f59e57cf8becf26666fa380fb73593e8f4a5;p=gitmo%2FMooseX-StrictConstructor.git diff --git a/lib/MooseX/StrictConstructor/Trait/Class.pm b/lib/MooseX/StrictConstructor/Trait/Class.pm index 707c75f..3d0f9a0 100644 --- a/lib/MooseX/StrictConstructor/Trait/Class.pm +++ b/lib/MooseX/StrictConstructor/Trait/Class.pm @@ -6,24 +6,23 @@ use namespace::autoclean; use B (); +my %pkg_attrs; + 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; + my $attrs = + $pkg_attrs{ref($instance)} ||= { + __INSTANCE__ => 1, + map { $_ => 1 } + grep {defined} + map { $_->init_arg() } $self->get_all_attributes() + }; - if (@bad) { + if (my @bad = sort grep { !$attrs->{$_} } keys %$params) { $self->throw_error( "Found unknown attribute(s) init_arg passed to the constructor: @bad" ); @@ -45,11 +44,16 @@ around '_inline_BUILDALL' => sub { map { $_->init_arg() } $self->get_all_attributes() ); + my $MY = 'my'; + if ($] >= 5.009004) { + push @source, "use feature 'state';"; + $MY = 'state'; + } + return ( @source, - 'my %attrs = (' . ( join ' ', @attrs ) . ');', - 'my @bad = sort grep { !$attrs{$_} } keys %{ $params };', - 'if (@bad) {', + $MY.' $attrs = {' . ( join ' ', @attrs ) . '};', + 'if (my @bad = sort grep { !$attrs->{$_} } keys %$params) {', 'Moose->throw_error("Found unknown attribute(s) passed to the constructor: @bad");', '}', );