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 df3ff64..3e2e1ec 100644 (file)
--- a/Changes
+++ b/Changes
@@ -8,6 +8,11 @@ for, noteworthy changes.
   * Several things that have been deprecated for a while have been removed. See
     the 2.0000 section in Moose::Manual::Delta for details.
 
+  [BUG FIXES]
+
+  * duck_type type constraints now report reasonable errors when given
+    something which isn't an instance of an object. (t0m)
+
 2.0102 Sat, Jun 18, 2011
 
   [ENHANCEMENTS]
index 0a8ef8a..8957156 100644 (file)
@@ -98,6 +98,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;
     $class ||= $value;
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;