aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Kitover <rkitover@cpan.org>2010-07-12 20:03:39 -0400
committerRafael Kitover <rkitover@cpan.org>2010-07-12 20:03:39 -0400
commitb058bf611520d8f60af9252d77886af53a907c3c (patch)
treece42109c5815b839911e54889860185615f658a5
parente930b397d88d9bbb04a4186c387485ca2aaf5e23 (diff)
downloadmx-alwayscoerce-b058bf611520d8f60af9252d77886af53a907c3c.tar.gz
mx-alwayscoerce-b058bf611520d8f60af9252d77886af53a907c3c.zip
actually apply Schwern's patch
-rw-r--r--lib/MooseX/AlwaysCoerce.pm14
-rw-r--r--t/01-basic.t.orig51
2 files changed, 12 insertions, 53 deletions
diff --git a/lib/MooseX/AlwaysCoerce.pm b/lib/MooseX/AlwaysCoerce.pm
index b82c423..b8ca807 100644
--- a/lib/MooseX/AlwaysCoerce.pm
+++ b/lib/MooseX/AlwaysCoerce.pm
@@ -54,18 +54,28 @@ Use C<< coerce => 0 >> to disable a coercion explicitly.
use namespace::autoclean;
use Moose::Role;
- has coerce => (is => 'rw', default => 1);
+ has coerce => (
+ lazy => 1,
+ reader => "should_coerce",
+ default => sub {
+ return 1 if shift->type_constraint->has_coercion;
+ return 0;
+ }
+ );
+
package MooseX::AlwaysCoerce::Role::Meta::Class;
use namespace::autoclean;
use Moose::Role;
+ use Moose::Util::TypeConstraints;
around add_class_attribute => sub {
my $next = shift;
my $self = shift;
my ($what, %opts) = @_;
- $opts{coerce} = 1 unless exists $opts{coerce};
+ my $type = Moose::Util::TypeConstraints::find_or_parse_type_constraint($opts{isa});
+ $opts{coerce} = 1 if !exists $opts{coerce} and $type->has_coercion;
$self->$next($what, %opts);
};
diff --git a/t/01-basic.t.orig b/t/01-basic.t.orig
deleted file mode 100644
index 87ca3c0..0000000
--- a/t/01-basic.t.orig
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-
-use Test::More tests => 7;
-
-{
- package MyClass;
- use Moose;
- use MooseX::AlwaysCoerce;
- use Moose::Util::TypeConstraints;
-
- subtype 'MyType', as 'Int';
- coerce 'MyType', from 'Str', via { length $_ };
-
- subtype 'Uncoerced', as 'Int';
-
- has foo => (is => 'rw', isa => 'MyType');
-
- class_has bar => (is => 'rw', isa => 'MyType');
-
- class_has baz => (is => 'rw', isa => 'MyType', coerce => 0);
-
- has quux => (is => 'rw', isa => 'MyType', coerce => 0);
-
- has uncoerced_attr => (is => 'rw', isa => 'Uncoerced');
-
- class_has uncoerced_class_attr => (is => 'rw', isa => 'Uncoerced');
-}
-
-ok( (my $instance = MyClass->new), 'instance' );
-
-eval { $instance->foo('bar') };
-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' );
-
-undef $@;
-
-eval { $instance->quux('mtfnpy') };
-ok( $@, 'attribute coercion did not run with coerce => 0' );
-
-eval { $instance->uncoerced_attr(10) };
-is $@, "", 'set attribute having type with no coercion and no coerce=0';
-
-eval { $instance->uncoerced_class_attr(10) };
-is $@, "", 'set class attribute having type with no coercion and no coerce=0';