remove multi-populate code to fix exists/defined new() bug
Matt S Trout [Tue, 26 Jun 2012 19:25:23 +0000 (19:25 +0000)]
Changes
lib/Method/Generate/Accessor.pm
lib/Method/Generate/Constructor.pm
t/undef-bug.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 7d4e08c..e9a1532 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,4 @@
+  - remove multi-populate code to fix exists/defined new() bug
   - document move to #moose and include repository metadata
   - no Moo and no Moo::Role
   - squelch used only once warnings for $Moo::HandleMoose::MOUSE
index 7056200..fe268ba 100644 (file)
@@ -398,11 +398,6 @@ sub _generate_populate_set {
   }
 }
 
-sub generate_multi_set {
-  my ($self, $me, $to_set, $from) = @_;
-  "\@{${me}}{qw(${\join ' ', @$to_set})} = $from";
-}
-
 sub _generate_core_set {
   my ($self, $me, $name, $spec, $value) = @_;
   my $name_str = perlstring $name;
index e0746d7..080442b 100644 (file)
@@ -136,28 +136,15 @@ _EOA
 
 sub _assign_new {
   my ($self, $spec) = @_;
-  my (@init, @slots, %test);
   my $ag = $self->accessor_generator;
+  my %test;
   NAME: foreach my $name (sort keys %$spec) {
     my $attr_spec = $spec->{$name};
-    unless ($ag->is_simple_attribute($name, $attr_spec)) {
-      next NAME unless defined($attr_spec->{init_arg})
-                         or $ag->has_eager_default($name, $attr_spec);
-      $test{$name} = $attr_spec->{init_arg};
-      next NAME;
-    }
-    next NAME unless defined(my $i = $attr_spec->{init_arg});
-    push @init, $i;
-    push @slots, $name;
+    next NAME unless defined($attr_spec->{init_arg})
+                       or $ag->has_eager_default($name, $attr_spec);
+    $test{$name} = $attr_spec->{init_arg};
   }
-  return '' unless @init or %test;
-  join '', (
-    @init
-      ? '    '.$self->_cap_call($ag->generate_multi_set(
-          '$new', [ @slots ], '@{$args}{qw('.join(' ',@init).')}', $spec
-        )).";\n"
-      : ''
-  ), map {
+  join '', map {
     my $arg_key = perlstring($test{$_});
     my $test = "exists \$args->{$arg_key}";
     my $source = "\$args->{$arg_key}";
diff --git a/t/undef-bug.t b/t/undef-bug.t
new file mode 100644 (file)
index 0000000..c3ed934
--- /dev/null
@@ -0,0 +1,13 @@
+use Test::More tests => 1;
+
+package Foo;
+use Moo;
+
+has this => (is => 'ro');
+
+package main;
+
+my $foo = Foo->new;
+
+ok not(exists($foo->{this})),
+    "new objects don't have undef attributes";