Tweaks for type constraints; note that type constrains are overloaded
Fuji, Goro [Sun, 7 Nov 2010 11:59:05 +0000 (20:59 +0900)]
lib/Mouse/Util/TypeConstraints.pm

index 6251719..c6917fd 100644 (file)
@@ -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;