From bb7cca58bd0aeb53796d1e058082f04077c630cc Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Wed, 4 Aug 2010 23:43:31 -0400 Subject: support attributes without isa, better tests, release --- Changes | 3 +++ lib/MooseX/AlwaysCoerce.pm | 15 ++++++++------- t/01-basic.t | 38 ++++++++++++++++++++++++++++++-------- t/03-roles.t | 41 ++++++++++++++++++++++++++++++++--------- t/04-parameterized-roles.t | 40 ++++++++++++++++++++++++++++++++-------- 5 files changed, 105 insertions(+), 32 deletions(-) diff --git a/Changes b/Changes index 90d4d03..d53d72a 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for MooseX-AlwaysCoerce +0.09 2010-08-05 03:42:07 + - support attributes without isa, correctly + 0.08 2010-08-05 03:14:37 - make a test safer diff --git a/lib/MooseX/AlwaysCoerce.pm b/lib/MooseX/AlwaysCoerce.pm index 51e2f2e..66bb1e9 100644 --- a/lib/MooseX/AlwaysCoerce.pm +++ b/lib/MooseX/AlwaysCoerce.pm @@ -18,11 +18,11 @@ MooseX::AlwaysCoerce - Automatically enable coercions for Moose attributes =head1 VERSION -Version 0.08 +Version 0.09 =cut -our $VERSION = '0.08'; +our $VERSION = '0.09'; =head1 SYNOPSIS @@ -62,7 +62,7 @@ Use C<< coerce => 0 >> to disable a coercion explicitly. return $current_val if defined $current_val; - return 1 if $self->type_constraint->has_coercion; + return 1 if $self->type_constraint && $self->type_constraint->has_coercion; return 0; }; @@ -77,10 +77,10 @@ Use C<< coerce => 0 >> to disable a coercion explicitly. my $self = shift; my ($what, %opts) = @_; - return unless exists $opts{isa}; - - my $type = Moose::Util::TypeConstraints::find_or_parse_type_constraint($opts{isa}); - $opts{coerce} = 1 if not exists $opts{coerce} and $type->has_coercion; + if (exists $opts{isa}) { + my $type = Moose::Util::TypeConstraints::find_or_parse_type_constraint($opts{isa}); + $opts{coerce} = 1 if not exists $opts{coerce} and $type->has_coercion; + } $self->$next($what, %opts); }; @@ -167,3 +167,4 @@ under the same terms as Perl itself. =cut 1; # End of MooseX::AlwaysCoerce +# vim:et sts=4 sw=4 tw=0: diff --git a/t/01-basic.t b/t/01-basic.t index f6d017f..fee6ece 100644 --- a/t/01-basic.t +++ b/t/01-basic.t @@ -2,7 +2,7 @@ use strict; use warnings; -use Test::More tests => 8; +use Test::More tests => 10; use Test::Exception; use Test::NoWarnings; @@ -29,14 +29,22 @@ use Test::NoWarnings; class_has uncoerced_class_attr => (is => 'rw', isa => 'Uncoerced'); + has untyped_attr => (is => 'rw'); + class_has untyped_class_attr => (is => 'rw'); } ok( (my $instance = MyClass->new), 'instance' ); -lives_ok { $instance->foo('bar') } 'attribute coercion ran'; +lives_and { + $instance->foo('bar'); + is $instance->foo, 3; +} 'attribute coercion ran'; -lives_ok { $instance->bar('baz') } 'class attribute coercion ran'; +lives_and { + $instance->bar('baz'); + is $instance->bar, 3; +} 'class attribute coercion ran'; dies_ok { $instance->baz('quux') } 'class attribute coercion did not run with coerce => 0'; @@ -44,8 +52,22 @@ dies_ok { $instance->baz('quux') } dies_ok { $instance->quux('mtfnpy') } 'attribute coercion did not run with coerce => 0'; -lives_ok { $instance->uncoerced_attr(10) } - 'set attribute having type with no coercion and no coerce=0'; - -lives_ok { $instance->uncoerced_class_attr(10) } - 'set class attribute having type with no coercion and no coerce=0'; +lives_and { + $instance->uncoerced_attr(10); + is $instance->uncoerced_attr(10), 10; +} 'set attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->uncoerced_class_attr(10); + is $instance->uncoerced_class_attr(10), 10; +} 'set class attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->untyped_attr(10); + is $instance->untyped_attr, 10; +} 'set untyped attribute'; + +lives_and { + $instance->untyped_class_attr(10); + is $instance->untyped_class_attr, 10; +} 'set untyped class attribute'; diff --git a/t/03-roles.t b/t/03-roles.t index 1dfd692..88c87d6 100644 --- a/t/03-roles.t +++ b/t/03-roles.t @@ -2,7 +2,7 @@ use strict; use warnings; -use Test::More tests => 8; +use Test::More tests => 10; use Test::Exception; use Test::NoWarnings; @@ -28,6 +28,10 @@ use Test::NoWarnings; has uncoerced_attr => (is => 'rw', isa => 'Uncoerced'); class_has uncoerced_class_attr => (is => 'rw', isa => 'Uncoerced'); + + has untyped_attr => (is => 'rw'); + + class_has untyped_class_attr => (is => 'rw'); } { @@ -41,10 +45,16 @@ ok( (my $instance = MyClass->new), 'instance' ); { local $TODO = 'waiting on Moose changes for role support'; - lives_ok { $instance->foo('bar') } 'attribute coercion ran'; + lives_and { + $instance->foo('bar'); + is $instance->foo, 3; + } 'attribute coercion ran'; } -lives_ok { $instance->bar('baz') } 'class attribute coercion ran'; +lives_and { + $instance->bar('baz'); + is $instance->bar, 3; +} 'class attribute coercion ran'; dies_ok { $instance->baz('quux') } 'class attribute coercion did not run with coerce => 0'; @@ -52,9 +62,22 @@ dies_ok { $instance->baz('quux') } dies_ok { $instance->quux('mtfnpy') } 'attribute coercion did not run with coerce => 0'; -lives_ok { $instance->uncoerced_attr(10) } - 'set attribute having type with no coercion and no coerce=0'; - -lives_ok { $instance->uncoerced_class_attr(10) } - 'set class attribute having type with no coercion and no coerce=0'; - +lives_and { + $instance->uncoerced_attr(10); + is $instance->uncoerced_attr(10), 10; +} 'set attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->uncoerced_class_attr(10); + is $instance->uncoerced_class_attr(10), 10; +} 'set class attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->untyped_attr(10); + is $instance->untyped_attr, 10; +} 'set untyped attribute'; + +lives_and { + $instance->untyped_class_attr(10); + is $instance->untyped_class_attr, 10; +} 'set untyped class attribute'; diff --git a/t/04-parameterized-roles.t b/t/04-parameterized-roles.t index ab8b541..d735cdd 100644 --- a/t/04-parameterized-roles.t +++ b/t/04-parameterized-roles.t @@ -35,6 +35,10 @@ eval <<'EOF'; class_has uncoerced_class_attr => (is => 'rw', isa => 'Uncoerced'); + has untyped_attr => (is => 'rw'); + + class_has untyped_class_attr => (is => 'rw'); + package Foo; use Moose; with 'Role'; @@ -45,7 +49,7 @@ if ($@) { 'MooseX::ClassAttribute is currently incompatible with MooseX::Role::Parameterized'; } -plan tests => 8; +plan tests => 10; eval 'use Test::NoWarnings'; @@ -54,10 +58,16 @@ ok( (my $instance = MyClass->new), 'instance' ); { local $TODO = 'waiting on Moose changes for role support, and ClassAttribute changes for paramterized role support'; - lives_ok { $instance->foo('bar') } 'attribute coercion ran'; + lives_and { + $instance->foo('bar'); + is $instance->foo, 3; + } 'attribute coercion ran'; } -lives_ok { $instance->bar('baz') } 'class attribute coercion ran'; +lives_and { + $instance->bar('baz'); + is $instance->bar, 3; +} 'class attribute coercion ran'; dies_ok { $instance->baz('quux') } 'class attribute coercion did not run with coerce => 0'; @@ -65,8 +75,22 @@ dies_ok { $instance->baz('quux') } dies_ok { $instance->quux('mtfnpy') } 'attribute coercion did not run with coerce => 0'; -lives_ok { $instance->uncoerced_attr(10) } - 'set attribute having type with no coercion and no coerce=0'; - -lives_ok { $instance->uncoerced_class_attr(10) } - 'set class attribute having type with no coercion and no coerce=0'; +lives_and { + $instance->uncoerced_attr(10); + is $instance->uncoerced_attr(10), 10; +} 'set attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->uncoerced_class_attr(10); + is $instance->uncoerced_class_attr(10), 10; +} 'set class attribute having type with no coercion and no coerce=0'; + +lives_and { + $instance->untyped_attr(10); + is $instance->untyped_attr, 10; +} 'set untyped attribute'; + +lives_and { + $instance->untyped_class_attr(10); + is $instance->untyped_class_attr, 10; +} 'set untyped class attribute'; -- cgit v1.2.3