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=4df703642cba97440250d82b4fd155eac5740871;hpb=60f0816092ffe11986388dd2bba56a356b697843;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeConstraint/Union.pm b/lib/Moose/Meta/TypeConstraint/Union.pm index 4df7036..857aaa7 100644 --- a/lib/Moose/Meta/TypeConstraint/Union.pm +++ b/lib/Moose/Meta/TypeConstraint/Union.pm @@ -9,7 +9,7 @@ use Moose::Meta::TypeCoercion::Union; use List::Util qw(first); -our $VERSION = '1.09'; +our $VERSION = '1.16'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -32,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;