X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FTypes%2FTypeDecorator.pm;h=fa97bb79765b25f5d1663bad9fdf0f24186667fb;hb=cabfc8ede99ead991887b0e6c4285521245e19f2;hp=2b9398e2e7c81d16515e2af81be84aa6d6f5cc86;hpb=06cab0010179d60088cc5cfb5e6d5016f8697ccc;p=gitmo%2FMooseX-Types.git diff --git a/lib/MooseX/Types/TypeDecorator.pm b/lib/MooseX/Types/TypeDecorator.pm index 2b9398e..fa97bb7 100644 --- a/lib/MooseX/Types/TypeDecorator.pm +++ b/lib/MooseX/Types/TypeDecorator.pm @@ -116,7 +116,10 @@ handle $self->isa since AUTOLOAD can't. =cut -sub isa { shift->_try_delegate('isa', @_) } +sub isa { + return 1 if $_[1]->isa('Moose::Meta::TypeConstraint'); + shift->_try_delegate('isa', @_) +} =head2 can @@ -169,10 +172,24 @@ sub AUTOLOAD { sub _try_delegate { my ($self, $method, @args) = @_; my $tc = $self->__type_constraint; + my $class; + my $search_tc = $tc; + while ($search_tc->is_subtype_of('Object')) { + if ($search_tc->isa('Moose::Meta::TypeConstraint::Class')) { + $class = $search_tc->class; + last; + } + $search_tc = $search_tc->parent; + } + my $inv = ( - $tc->isa('Moose::Meta::TypeConstraint::Class') - ? $self->__type_constraint->class - : $self->__type_constraint + $class + ? ( + $method eq 'new' || $class->can($method) + ? $class + : $tc + ) + : $tc ); $inv->$method(@args); }