Fix an issue that anonymous type constraint can't be defined
gfx [Sat, 19 Dec 2009 07:30:46 +0000 (16:30 +0900)]
lib/Mouse/Util/TypeConstraints.pm
t/001_mouse/039-subtype.t

index 1ccdae1..928ff93 100644 (file)
@@ -99,9 +99,7 @@ sub _create_type{
     }
 
     if(!defined $name){
-        if(!defined($name = $args{name})){
-            $name = '__ANON__';
-        }
+        $name = $args{name};
     }
 
     $args{name} = $name;
@@ -110,16 +108,20 @@ sub _create_type{
         $parent = delete $args{as};
         if(!$parent){
             $parent = delete $args{name};
-            $name   = '__ANON__';
+            $name   = undef;
         }
     }
 
-    my $package_defined_in = $args{package_defined_in} ||= caller(1);
-
-    my $existing = $TYPE{$name};
-    if($existing && $existing->{package_defined_in} ne $package_defined_in){
-        confess("The type constraint '$name' has already been created in "
-              . "$existing->{package_defined_in} and cannot be created again in $package_defined_in");
+    if(defined $name){
+        my $package_defined_in = $args{package_defined_in} ||= caller(1);
+        my $existing = $TYPE{$name};
+        if($existing && $existing->{package_defined_in} ne $package_defined_in){
+            confess("The type constraint '$name' has already been created in "
+                  . "$existing->{package_defined_in} and cannot be created again in $package_defined_in");
+        }
+    }
+    else{
+        $args{name} = '__ANON__';
     }
 
     $args{constraint} = delete $args{where}        if exists $args{where};
@@ -133,7 +135,12 @@ sub _create_type{
         $constraint = Mouse::Meta::TypeConstraint->new(%args);
     }
 
-    return $TYPE{$name} = $constraint;
+    if(defined $name){
+        return $TYPE{$name} = $constraint;
+    }
+    else{
+        return $constraint;
+    }
 }
 
 sub type {
index 50b7bf9..7142f2b 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
-use Test::More tests => 11;
+use Test::More tests => 14;
 use Test::Exception;
 
 use Mouse::Util::TypeConstraints;
@@ -24,8 +24,6 @@ do {
         is  => 'ro',
         isa => 'NonemptyStr',
     );
-
-
 };
 
 ok(My::Class->new(name => 'foo'));
@@ -48,3 +46,13 @@ lives_and{
     ok!$tc->check([]);
     ok!$tc->check(undef);
 };
+
+package Foo;
+use Mouse::Util::TypeConstraints;
+
+$st = subtype as 'Int', where{ $_ > 0 };
+
+::ok $st->is_a_type_of('Int');
+::ok $st->check(10);
+::ok!$st->check(0);
+