fix portability between Moose/Mouse's class_type
Daisuke Maki (lestrrat) [Tue, 10 Mar 2009 05:37:04 +0000 (14:37 +0900)]
lib/Mouse/Util/TypeConstraints.pm
t/800_shikabased/005-class_type.t

index d81d5d0..8b3841b 100644 (file)
@@ -106,6 +106,7 @@ sub subtype {
     } else {
         $TYPE{$name} = sub { local $_=$_[0]; $constraint->($_) };
     }
+    return $name;
 }
 
 sub coerce {
@@ -137,12 +138,16 @@ sub coerce {
 }
 
 sub class_type {
-    my $pkg = caller(0);
     my($name, $conf) = @_;
-    my $class = $conf->{class};
-    subtype(
-        $name => where => sub { $_->isa($class) }
-    );
+    if ($conf && $conf->{class}) {
+        # No, you're using this wrong
+        warn "class_type() should be class_type(ClassName). Perhaps you're looking for subtype $name => as '$conf->{class}'?";
+        subtype($name, as => $conf->{class});
+    } else {
+        subtype(
+            $name => where => sub { $_->isa($name) }
+        );
+    }
 }
 
 sub role_type {
index e58fde2..5b61762 100644 (file)
@@ -8,7 +8,14 @@ use Test::More tests => 4;
 
     require t::lib::ClassType_Foo;
 
-    class_type Headers => { class => 't::lib::ClassType_Foo' };
+    # XXX: This below API is different from that of Moose.
+    # class_type() should be class_type 'ClassName';
+    #    class_type 'Headers' => { class => 't::lib::ClassType_Foo' };
+    # this should be subtype Headers => as 't::lib::ClassType_foo';
+    subtype 'Headers'
+        => as 't::lib::ClassType_Foo'
+    ;
+        
     coerce 'Headers' =>
         from 'HashRef' => via {
             t::lib::ClassType_Foo->new(%{ $_ });