release
[gitmo/MooseX-AlwaysCoerce.git] / lib / MooseX / AlwaysCoerce.pm
index ab98a64..3fbfd59 100644 (file)
@@ -18,11 +18,11 @@ MooseX::AlwaysCoerce - Automatically enable coercions for Moose attributes
 
 =head1 VERSION
 
-Version 0.02
+Version 0.05
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.05';
 
 =head1 SYNOPSIS
 
@@ -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
 
 {
@@ -52,16 +54,30 @@ enabled for every attribute and class attribute automatically.
     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;
-        $self->$next(@_, coerce => 1);
+        my ($what, %opts) = @_;
+
+        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);
     };
 }
 
@@ -87,6 +103,10 @@ sub init_meta {
 
 Rafael Kitover, C<< <rkitover at cpan.org> >>
 
+=head1 CONTRIBUTORS
+
+Schwern: Michael G. Schwern <mschwern@cpan.org>
+
 =head1 BUGS
 
 Please report any bugs or feature requests to C<bug-moosex-alwayscoerce at rt.cpan.org>, or through