Remove pointless shebang in each module
[gitmo/Mouse.git] / lib / Mouse / TypeRegistry.pm
index f11a831..dccc736 100644 (file)
@@ -1,10 +1,9 @@
-#!/usr/bin/env perl
 package Mouse::TypeRegistry;
 use strict;
 use warnings;
 
 use Carp ();
-use Mouse::Util qw/blessed looks_like_number openhandle/;
+use Scalar::Util qw/blessed looks_like_number openhandle/;
 
 my %SUBTYPE;
 my %COERCE;
@@ -92,19 +91,21 @@ sub _subtype {
     if (my $type = $SUBTYPE{$name}) {
         Carp::croak "The type constraint '$name' has already been created, cannot be created again in $pkg";
     };
-    my $as = $conf{as};
-    my $stuff = $conf{where} || optimized_constraints()->{$as};
-
-    $SUBTYPE{$name} = $stuff;
+    my $stuff = $conf{where} || do { $SUBTYPE{delete $conf{as} || 'Any' } };
+    my $as    = $conf{as} || '';
+    if ($as = $SUBTYPE{$as}) {
+        $SUBTYPE{$name} = sub { $as->($_) && $stuff->($_) };
+    } else {
+        $SUBTYPE{$name} = $stuff;
+    }
 }
 
 sub _coerce {
     my($name, %conf) = @_;
 
     Carp::croak "Cannot find type '$name', perhaps you forgot to load it."
-        unless optimized_constraints()->{$name};
+        unless $SUBTYPE{$name};
 
-    my $subtypes = optimized_constraints();
     unless ($COERCE{$name}) {
         $COERCE{$name}      = {};
         $COERCE_KEYS{$name} = [];
@@ -114,7 +115,7 @@ sub _coerce {
             if $COERCE{$name}->{$type};
 
         Carp::croak "Could not find the type constraint ($type) to coerce from"
-            unless $subtypes->{$type};
+            unless $SUBTYPE{$type};
 
         push @{ $COERCE_KEYS{$name} }, $type;
         $COERCE{$name}->{$type} = $code;
@@ -125,6 +126,7 @@ sub _class_type {
     my $pkg = caller(0);
     my($name, $conf) = @_;
     my $class = $conf->{class};
+    Mouse::load_class($class);
     _subtype(
         $name => where => sub {
             defined $_ && ref($_) eq $class;
@@ -146,16 +148,15 @@ sub _role_type {
 sub typecast_constraints {
     my($class, $pkg, $type_constraint, $types, $value) = @_;
 
+    local $_;
     for my $type (ref($types) eq 'ARRAY' ? @{ $types } : ( $types )) {
         next unless $COERCE{$type};
-
         for my $coerce_type (@{ $COERCE_KEYS{$type}}) {
-            local $_ = $value;
-            if ($SUBTYPE{$coerce_type}->()) {
-                local $_ = $value;
-                local $_ = $COERCE{$type}->{$coerce_type}->();
-                return $_ if $type_constraint->();
-            }
+            $_ = $value;
+            next unless $SUBTYPE{$coerce_type}->();
+            $_ = $value;
+            $_ = $COERCE{$type}->{$coerce_type}->();
+            return $_ if $type_constraint->();
         }
     }
     return $value;