X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FTypeConstraint%2FUnion.pm;h=857aaa7c9f67f143ffe1203912fbed9cc6d322a5;hb=f4b86ac0e1fd7ff8a180f2f8332821170db5371e;hp=cd1696356f24e79a89c91f57c8e83fcea256fb1a;hpb=0f8380b0cdbda1e13ed7c456edd3f0d1c0315ec9;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeConstraint/Union.pm b/lib/Moose/Meta/TypeConstraint/Union.pm index cd16963..857aaa7 100644 --- a/lib/Moose/Meta/TypeConstraint/Union.pm +++ b/lib/Moose/Meta/TypeConstraint/Union.pm @@ -7,7 +7,9 @@ use metaclass; use Moose::Meta::TypeCoercion::Union; -our $VERSION = '0.86'; +use List::Util qw(first); + +our $VERSION = '1.16'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -30,12 +32,34 @@ sub new { ); $self->_set_constraint(sub { $self->check($_[0]) }); - $self->coercion(Moose::Meta::TypeCoercion::Union->new( - type_constraint => $self - )); + return $self; } +# XXX - this is a rather gross implementation of laziness for the benefit of +# MX::Types. If we try to call ->has_coercion on the objects during object +# construction, this does not work when defining a recursive constraint with +# MX::Types. +sub coercion { + my $self = shift; + + return $self->{coercion} if exists $self->{coercion}; + + # Using any instead of grep here causes a weird error with some corner + # cases when MX::Types is in use. See RT #61001. + if ( grep { $_->has_coercion } @{ $self->type_constraints } ) { + return $self->{coercion} = Moose::Meta::TypeCoercion::Union->new( + type_constraint => $self ); + } + else { + return $self->{coercion} = undef; + } +} + +sub has_coercion { + return defined $_[0]->coercion; +} + sub _actually_compile_type_constraint { my $self = shift; @@ -93,6 +117,12 @@ sub validate { return ($message . ' in (' . $self->name . ')') ; } +sub find_type_for { + my ($self, $value) = @_; + + return first { $_->check($value) } @{ $self->type_constraints }; +} + sub is_a_type_of { my ($self, $type_name) = @_; foreach my $type (@{$self->type_constraints}) { @@ -197,6 +227,12 @@ messages returned by the member type constraints. A type is considered equal if it is also a union type, and the two unions have the same member types. +=item B<< $constraint->find_type_for($value) >> + +This returns the first member type constraint for which C is +true, allowing you to determine which of the Union's member type constraints +a given value matches. + =item B<< $constraint->is_a_type_of($type_name_or_object) >> This returns true if any of the member type constraints return true @@ -216,9 +252,7 @@ as its parent. =head1 BUGS -All complex software has bugs lurking in it, and this module is no -exception. If you find a bug please either email me, or add the bug -to cpan-RT. +See L for details on reporting bugs. =head1 AUTHOR @@ -226,7 +260,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2009 by Infinity Interactive, Inc. +Copyright 2006-2010 by Infinity Interactive, Inc. L