X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FUtil%2FTypeConstraints.pm;h=73ad008205a3b09d8cba81654b0ddf61ff6a083a;hb=983d58a5ea543a21c48cb04311883f1b36de1874;hp=808bb6b8def12625e695f0b5319f9656b8c6d28d;hpb=9abaecfdec4e3ee1c8fae217b029a692155385a3;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Util/TypeConstraints.pm b/lib/Mouse/Util/TypeConstraints.pm index 808bb6b..73ad008 100644 --- a/lib/Mouse/Util/TypeConstraints.pm +++ b/lib/Mouse/Util/TypeConstraints.pm @@ -186,7 +186,7 @@ sub subtype { sub coerce { # coerce $type, from $from, via { ... }, ... my $type_name = shift; my $type = find_type_constraint($type_name) - or Carp::croak("Cannot find type '$type_name', perhaps you forgot to load it."); + or Carp::croak("Cannot find type '$type_name', perhaps you forgot to load it"); $type->_add_type_coercions(@_); return; @@ -290,8 +290,9 @@ sub _find_or_create_parameterized_type{ } sub _find_or_create_union_type{ - return if grep{ not defined } @_; - my @types = sort map{ $_->{type_constraints} ? @{$_->{type_constraints}} : $_ } @_; + return if grep{ not defined } @_; # all things must be defined + my @types = sort + map{ $_->{type_constraints} ? @{$_->{type_constraints}} : $_ } @_; my $name = join '|', @types; @@ -383,39 +384,43 @@ sub register_type_constraint { my($constraint) = @_; Carp::croak("No type supplied / type is not a valid type constraint") unless Mouse::Util::is_a_type_constraint($constraint); - my $name = $constraint->name; - Carp::croak("Can't register an unnamed type constraint") - unless defined $name; - return $TYPE{$name} = $constraint; + return $TYPE{$constraint->name} = $constraint; } sub find_or_parse_type_constraint { my($spec) = @_; return $spec if Mouse::Util::is_a_type_constraint($spec) or not defined $spec; - $spec =~ s/\s+//g; - return $TYPE{$spec} || do{ - my $context = { - spec => $spec, - orig => $spec, - }; - my $type = _parse_type($context); + $spec =~ tr/ \t\r\n//d; - if($context->{spec}){ - Carp::croak("Syntax error: extra elements '$context->{spec}' in '$context->{orig}'"); - } - $type; - }; + my $tc = $TYPE{$spec}; + if(defined $tc) { + return $tc; + } + + my %context = ( + spec => $spec, + orig => $spec, + ); + $tc = _parse_type(\%context); + + if($context{spec}){ + Carp::croak("Syntax error: extra elements '$context{spec}' in '$context{orig}'"); + } + + return $TYPE{$spec} = $tc; } sub find_or_create_does_type_constraint{ # XXX: Moose does not register a new role_type, but Mouse does. - return find_or_parse_type_constraint(@_) || role_type(@_); + my $tc = find_or_parse_type_constraint(@_); + return defined($tc) ? $tc : role_type(@_); } sub find_or_create_isa_type_constraint { # XXX: Moose does not register a new class_type, but Mouse does. - return find_or_parse_type_constraint(@_) || class_type(@_); + my $tc = find_or_parse_type_constraint(@_); + return defined($tc) ? $tc : class_type(@_); } 1; @@ -427,7 +432,7 @@ Mouse::Util::TypeConstraints - Type constraint system for Mouse =head1 VERSION -This document describes Mouse version 0.76 +This document describes Mouse version 0.94 =head2 SYNOPSIS