Really make the strict constructor work after immutabilization.
Dave Rolsky [Thu, 15 Nov 2007 21:00:52 +0000 (21:00 +0000)]
Also, add an optimization to the immutable version. Pre-compute the
set of applicable attributes once when generating the constructor,
rather than on every call to new().

lib/MooseX/StrictConstructor/Meta/Method/Constructor.pm
t/basic.t

index 7d2017c..f72fa66 100644 (file)
@@ -3,28 +3,32 @@ package MooseX::StrictConstructor::Meta::Method::Constructor;
 use strict;
 use warnings;
 
+use Carp ();
 use Moose;
 
 extends 'Moose::Meta::Method::Constructor';
 
+# using 
 sub _generate_BUILDALL ## no critic RequireArgUnpacking
 {
     my $self = shift;
 
-    my $calls = $self->SUPER::_generate_BUILDALL(@_);
+    my $source = $self->SUPER::_generate_BUILDALL(@_);
+    $source .= ";\n" if $source;
 
-    $calls .= <<'EOF';
-    my %attrs = map { $_->name() => 1 } $self->meta()->compute_all_applicable_attributes();
+    my @attrs = map { $_->name() . ' => 1,' } @{ $self->attributes() };
 
-    my @bad = sort grep { ! $attrs{$_} }  keys %params;
+    $source .= <<"EOF";
+my \%attrs = (@attrs);
 
-    if (@bad)
-    {
-        confess "Found unknown attribute(s) passed to the constructor: @bad";
-    }
+my \@bad = sort grep { ! \$attrs{\$_} }  keys \%params;
+
+if (\@bad) {
+    Carp::confess "Found unknown attribute(s) passed to the constructor: \@bad";
+}
 EOF
 
-    return $calls;
+    return $source;
 };
 
 
index cb0fec7..9c26f8d 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -71,6 +71,9 @@ use Test::More tests => 9;
 
         delete $params->{spy};
     }
+
+    no Moose;
+    __PACKAGE__->meta()->make_immutable();
 }