allow parameterized types to customize their messages
Brian Phillips [Tue, 2 Aug 2011 13:22:54 +0000 (08:22 -0500)]
The same arguments that are passed to the where block are also passed to
the message block to allow the error message to be customized.

lib/MooseX/Meta/TypeConstraint/Parameterizable.pm
t/08-custom-messages.t [new file with mode: 0644]

index 44f2abc..fbef572 100644 (file)
@@ -192,7 +192,7 @@ sub parameterize {
                     constraining_value => $args,
                     parent_type_constraint=>$self->parent_type_constraint,
                     constraining_value_type_constraint => $self->constraining_value_type_constraint,
-                    ($self->has_message ? (message => $self->message) : ()),
+                    ($self->has_message ? (message => sub { $self->message->( @_, $args ) } ) : ()),
                 );
             }
         }
diff --git a/t/08-custom-messages.t b/t/08-custom-messages.t
new file mode 100644 (file)
index 0000000..b53eb6d
--- /dev/null
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+
+use Test::More;
+use MooseX::Types -declare=>[qw( SizedArray )];
+use MooseX::Types::Parameterizable qw(Parameterizable);
+use MooseX::Types::Moose qw( Int ArrayRef );
+
+ok subtype(
+    SizedArray,
+    as Parameterizable[ArrayRef,Int],
+    where {
+        my ($value, $max) = @_;
+        @$value > $max
+    },
+    message {
+        my($value, $max) = @_;
+        return sprintf('%d > %d', scalar(@$value), $max);
+    }
+), 'Created parameterized type';
+
+is SizedArray([3])->get_message([1..4]), q{4 > 3}, 'custom message';
+
+done_testing;