fix pre-5.8.3 weak_ref setter as well
[gitmo/Moo.git] / lib / Method / Generate / Accessor.pm
index 21b8924..be2ac5f 100644 (file)
@@ -36,6 +36,9 @@ sub generate_method {
     die "Unknown is ${is}";
   }
   $spec->{builder} = '_build_'.$name if ($spec->{builder}||0) eq 1;
+  die "Invalid builder for $into->$name - not a valid method name"
+    if exists $spec->{builder} and (ref $spec->{builder}
+      or $spec->{builder} !~ /\A[A-Za-z_][A-Za-z0-9_]*(?:::[A-Za-z_][A-Za-z0-9_]*)*\z/);
   if (($spec->{predicate}||0) eq 1) {
     $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}";
   }
@@ -332,15 +335,14 @@ sub _generate_call_code {
   my ($self, $name, $type, $values, $sub) = @_;
   if (my $quoted = quoted_from_sub($sub)) {
     my $code = $quoted->[1];
-    my $at_ = '@_ = ('.$values.');';
     if (my $captures = $quoted->[2]) {
       my $cap_name = qq{\$${type}_captures_for_${name}};
       $self->{captures}->{$cap_name} = \$captures;
       Sub::Quote::inlinify(
-        $code, $values, Sub::Quote::capture_unroll($cap_name, $captures, 6)
+        $code, $values, Sub::Quote::capture_unroll($cap_name, $captures, 6), 1
       );
     } else {
-      Sub::Quote::inlinify($code, $values);
+      Sub::Quote::inlinify($code, $values, undef, 1);
     }
   } else {
     my $cap_name = qq{\$${type}_for_${name}};
@@ -446,21 +448,23 @@ sub _generate_simple_set {
     #
     # but requires XS and is just too damn crazy
     # so simply throw a better exception
-    my $weak_simple = "my \$preserve; Scalar::Util::weaken(${simple})";
+    my $weak_simple = "my \$preserve; Scalar::Util::weaken(${simple}); no warnings 'void'; \$preserve";
     Moo::_Utils::lt_5_8_3() ? <<"EOC" : $weak_simple;
 
       my \$preserve;
-      eval { Scalar::Util::weaken($simple); 1 } or do {
-        if( \$@ =~ /Modification of a read-only value attempted/) {
-          require Carp;
-          Carp::croak( sprintf (
-            'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3',
-            $name_str,
-          ) );
-        } else {
-          die \$@;
+      eval { Scalar::Util::weaken($simple); 1 }
+        ? do { no warnings 'void'; \$preserve; }
+        : do {
+          if( \$@ =~ /Modification of a read-only value attempted/) {
+            require Carp;
+            Carp::croak( sprintf (
+              'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3',
+              $name_str,
+            ) );
+          } else {
+            die \$@;
+          }
         }
-      };
 EOC
   } else {
     $self->_generate_core_set($me, $name, $spec, $value);