throw an error on non-string builder (RT#78479)
Dagfinn Ilmari Mannsåker [Mon, 30 Jul 2012 21:34:34 +0000 (22:34 +0100)]
Changes
lib/Method/Generate/Accessor.pm
t/method-generate-accessor.t

diff --git a/Changes b/Changes
index 37ec51e..d4f729a 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,4 @@
+  - throw an error on non-string builder (RT#78479)
   - require D::GD 0.07 to avoid prototype mismatch errors
   - fix stupid typo in new Sub::Quote section
 
index 7089056..c644919 100644 (file)
@@ -36,6 +36,8 @@ 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 string"
+    if exists $spec->{builder} and ref $spec->{builder};
   if (($spec->{predicate}||0) eq 1) {
     $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}";
   }
index 6914ba5..22d88af 100644 (file)
@@ -68,6 +68,16 @@ for my $setting (qw( default coerce )) {
   );
 }
 
+is(
+  exception { $gen->generate_method('Foo' => 'ten' => { is => 'ro', builder => '_build_ten' }) },
+  undef, 'builder - string accepted',
+);
+
+like(
+  exception { $gen->generate_method('Foo' => 'eleven' => { is => 'ro', builder => sub {} }) },
+  qr/Invalid builder/, 'builder - coderef rejected'
+);
+
 my $foo = Foo->new(one => 1);
 
 is($foo->one, 1, 'ro reads');