From: Fuji, Goro Date: Sun, 7 Nov 2010 11:59:05 +0000 (+0900) Subject: Tweaks for type constraints; note that type constrains are overloaded X-Git-Tag: 0.83~8 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=74c6212da4c29f567561f373ad5273464a3c9189;p=gitmo%2FMouse.git Tweaks for type constraints; note that type constrains are overloaded --- diff --git a/lib/Mouse/Util/TypeConstraints.pm b/lib/Mouse/Util/TypeConstraints.pm index 6251719..c6917fd 100644 --- a/lib/Mouse/Util/TypeConstraints.pm +++ b/lib/Mouse/Util/TypeConstraints.pm @@ -393,29 +393,36 @@ 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;