You can redefine types in the original package
Shawn M Moore [Mon, 22 Dec 2008 03:32:37 +0000 (03:32 +0000)]
lib/Mouse/Util/TypeConstraints.pm
t/800_shikabased/002-coerce_multi_class.t

index 732797f..ec44eb1 100644 (file)
@@ -90,7 +90,7 @@ my $optimized_constraints_base;
 sub _type {
     my $pkg = caller(0);
     my($name, %conf) = @_;
-    if (my $type = $TYPE{$name}) {
+    if ($TYPE{$name} && $TYPE_SOURCE{$name} ne $pkg) {
         Carp::croak "The type constraint '$name' has already been created in $TYPE_SOURCE{$name} and cannot be created again in $pkg";
     };
     my $constraint = $conf{where} || do { $TYPE{delete $conf{as} || 'Any' } };
@@ -102,7 +102,7 @@ sub _type {
 sub _subtype {
     my $pkg = caller(0);
     my($name, %conf) = @_;
-    if (my $type = $TYPE{$name}) {
+    if ($TYPE{$name} && $TYPE_SOURCE{$name} ne $pkg) {
         Carp::croak "The type constraint '$name' has already been created in $TYPE_SOURCE{$name} and cannot be created again in $pkg";
     };
     my $constraint = $conf{where} || do { $TYPE{delete $conf{as} || 'Any' } };
index b2d26b8..2166e3f 100644 (file)
@@ -90,9 +90,11 @@ ok !$@;
 
 eval {
     package Response;
-    type 'Headers' => where { defined $_ && eval { $_->isa('Response::Headers') } };
+    type 'Headers' => where {
+        eval { $_->isa('Response::Headers') }
+    };
 };
-like $@, qr/The type constraint 'Headers' has already been created in Response and cannot be created again in Response/;
+ok(!$@, "You can redefine types in their original package");
 
 {
     package Request;