make coerce => 0 work for class_has
Rafael Kitover [Tue, 16 Jun 2009 17:49:47 +0000 (10:49 -0700)]
lib/MooseX/AlwaysCoerce.pm
t/01-basic.t

index ab98a64..4247664 100644 (file)
@@ -45,6 +45,8 @@ coercion not run?" only to find out that you forgot C<< coerce => 1 >> ?
 Just load this module in your L<Moose> class and C<< coerce => 1 >> will be
 enabled for every attribute and class attribute automatically.
 
+Use C<< coerce => 0 >> to disable a coercion explicitly.
+
 =cut
 
 {
@@ -61,7 +63,11 @@ enabled for every attribute and class attribute automatically.
     around add_class_attribute => sub {
         my $next = shift;
         my $self = shift;
-        $self->$next(@_, coerce => 1);
+        my ($what, %opts) = @_;
+
+        $opts{coerce} = 1 unless exists $opts{coerce};
+
+        $self->$next($what, %opts);
     };
 }
 
index 5b57cf8..e15c758 100644 (file)
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 3;
+use Test::More tests => 4;
 
 {
     package MyClass;
@@ -16,6 +16,8 @@ use Test::More tests => 3;
     has foo => (is => 'rw', isa => 'MyType');
 
     class_has bar => (is => 'rw', isa => 'MyType');
+
+    class_has baz => (is => 'rw', isa => 'MyType', coerce => 0);
 }
 
 ok( (my $instance = MyClass->new), 'instance' );
@@ -25,3 +27,6 @@ ok( (!$@), 'attribute coercion ran' );
 
 eval { $instance->bar('baz') };
 ok( (!$@), 'class attribute coercion ran' );
+
+eval { $instance->baz('quux') };
+ok( $@, 'class attribute coercion did not run with coerce => 0' );