From b058bf611520d8f60af9252d77886af53a907c3c Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Mon, 12 Jul 2010 20:03:39 -0400 Subject: actually apply Schwern's patch --- lib/MooseX/AlwaysCoerce.pm | 14 +++++++++++-- t/01-basic.t.orig | 51 ---------------------------------------------- 2 files changed, 12 insertions(+), 53 deletions(-) delete mode 100644 t/01-basic.t.orig 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'; -- cgit v1.2.3