bump version to 0.63
[gitmo/Moose.git] / lib / Moose / Meta / TypeCoercion.pm
index 35fa726..480b202 100644 (file)
@@ -5,12 +5,11 @@ use strict;
 use warnings;
 use metaclass;
 
-use Carp 'confess';
-
 use Moose::Meta::Attribute;
 use Moose::Util::TypeConstraints ();
 
-our $VERSION   = '0.03';
+our $VERSION   = '0.63';
+$VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
 __PACKAGE__->meta->add_attribute('type_coercion_map' => (
@@ -33,7 +32,7 @@ __PACKAGE__->meta->add_attribute('compiled_type_coercion' => (
 sub new { 
     my $class = shift;
     my $self  = $class->meta->new_object(@_);
-    $self->compile_type_coercion();
+    $self->compile_type_coercion;
     return $self;
 }
 
@@ -43,9 +42,9 @@ sub compile_type_coercion {
     my @coercions;
     while (@coercion_map) {
         my ($constraint_name, $action) = splice(@coercion_map, 0, 2);
-        my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint($constraint_name);
+        my $type_constraint = ref $constraint_name ? $constraint_name : Moose::Util::TypeConstraints::find_or_parse_type_constraint($constraint_name);
         (defined $type_constraint)
-            || confess "Could not find the type constraint ($constraint_name) to coerce from";
+            || Moose->throw_error("Could not find the type constraint ($constraint_name) to coerce from");
         push @coercions => [ 
             $type_constraint->_compiled_type_constraint, 
             $action 
@@ -55,8 +54,8 @@ sub compile_type_coercion {
         my $thing = shift;
         foreach my $coercion (@coercions) {
             my ($constraint, $converter) = @$coercion;
-            if (defined $constraint->($thing)) {
-                           local $_ = $thing;                
+            if ($constraint->($thing)) {
+                local $_ = $thing;                
                 return $converter->($thing);
             }
         }
@@ -64,6 +63,31 @@ sub compile_type_coercion {
     });    
 }
 
+sub has_coercion_for_type {
+    my ($self, $type_name) = @_;
+    my %coercion_map = @{$self->type_coercion_map};
+    exists $coercion_map{$type_name} ? 1 : 0;
+}
+
+sub add_type_coercions {
+    my ($self, @new_coercion_map) = @_;
+        
+    my $coercion_map = $self->type_coercion_map;    
+    my %has_coercion = @$coercion_map;
+    
+    while (@new_coercion_map) {
+        my ($constraint_name, $action) = splice(@new_coercion_map, 0, 2);        
+        
+        Moose->throw_error("A coercion action already exists for '$constraint_name'")
+            if exists $has_coercion{$constraint_name};
+        
+        push @{$coercion_map} => ($constraint_name, $action);
+    }
+    
+    # and re-compile ...
+    $self->compile_type_coercion;
+}
+
 sub coerce { $_[0]->_compiled_type_coercion->($_[1]) }
 
 
@@ -104,6 +128,10 @@ If you wish to use features at this depth, please come to the
 
 =item B<type_constraint>
 
+=item B<has_coercion_for_type>
+
+=item B<add_type_coercions>
+
 =back
 
 =head1 BUGS
@@ -118,11 +146,11 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006, 2007 by Infinity Interactive, Inc.
+Copyright 2006-2008 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself. 
 
-=cut
\ No newline at end of file
+=cut