X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FTypeCoercion.pm;h=aaae01356ef4b3472c37756f35fde8497e400811;hb=849811463e6a7531a72f545a9a78902724b4085e;hp=2f7cfde64b779a9d6bdafe455ac1429ceff1d9dd;hpb=b77fdbed20f583feab7a3990da4ebc04898217fc;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeCoercion.pm b/lib/Moose/Meta/TypeCoercion.pm index 2f7cfde..aaae013 100644 --- a/lib/Moose/Meta/TypeCoercion.pm +++ b/lib/Moose/Meta/TypeCoercion.pm @@ -10,12 +10,14 @@ use Carp 'confess'; use Moose::Meta::Attribute; use Moose::Util::TypeConstraints (); -our $VERSION = '0.02'; +our $VERSION = '0.06'; +our $AUTHORITY = 'cpan:STEVAN'; __PACKAGE__->meta->add_attribute('type_coercion_map' => ( reader => 'type_coercion_map', default => sub { [] } )); + __PACKAGE__->meta->add_attribute( Moose::Meta::Attribute->new('type_constraint' => ( reader => 'type_constraint', @@ -31,7 +33,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; } @@ -41,7 +43,7 @@ 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 = Moose::Util::TypeConstraints::find_or_create_type_constraint($constraint_name); (defined $type_constraint) || confess "Could not find the type constraint ($constraint_name) to coerce from"; push @coercions => [ @@ -53,8 +55,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); } } @@ -62,6 +64,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); + + confess "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]) } @@ -102,6 +129,10 @@ If you wish to use features at this depth, please come to the =item B +=item B + +=item B + =back =head1 BUGS @@ -116,11 +147,11 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006, 2007 by Infinity Interactive, Inc. +Copyright 2006-2008 by Infinity Interactive, Inc. L 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