Fix error reporting in duck_type
Tomas Doran [Thu, 23 Dec 2010 15:47:00 +0000 (15:47 +0000)]
Changes
lib/Moose/Meta/TypeConstraint/DuckType.pm
t/type_constraints/duck_types.t

diff --git a/Changes b/Changes
index 6384434..d859284 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,11 @@ for, noteworthy changes.
 
 {{$NEXT}}
 
+  [BUG FIXES]
+
+  * duck_type type constraints now report reasonable errors when given
+    something which isn't an instance of an object. (t0m)
+
 2.0008 Thu, Jun 16, 2011
 
   [BUG FIXES]
index 2878eed..b9bfbab 100644 (file)
@@ -89,6 +89,8 @@ sub get_message {
         return $self->SUPER::get_message(@_);
     }
 
+    return $self->SUPER::get_message($value) unless blessed($value);
+
     my @methods = grep { !$value->can($_) } @{ $self->methods };
     my $class = blessed $value;
     return $class
index cc12852..f0763c8 100644 (file)
@@ -76,4 +76,11 @@ is( exception { DucktypeTest->new( duck => RubberDuck->new ) }, undef, 'the Rubb
 # try with the other constraint form
 is( exception { DucktypeTest->new( other_swan => Swan->new ) }, undef, 'but a Swan can honk' );
 
+my $re = qr/Validation failed for 'DuckType' with value/;
+
+like( exception { DucktypeTest->new( duck => undef ) }, $re, 'Exception for undef' );
+like( exception { DucktypeTest->new( duck => [] ) }, $re, 'Exception for arrayref' );
+like( exception { DucktypeTest->new( duck => {} ) }, $re, 'Exception for hashref' );
+like( exception { DucktypeTest->new( duck => \'foo' ) }, $re, 'Exception for scalar ref' );
+
 done_testing;