Move type coercion mechanism from Util/TypeConstraints.pm to Meta/TypeConstraint.pm
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Accessor.pm
index 0fb563c..631fa32 100755 (executable)
@@ -15,7 +15,7 @@ sub _install_accessor{
     my $should_deref  = $attribute->should_auto_deref;
     my $should_coerce = $attribute->should_coerce;
 
-    my $compiled_type_constraint    = $constraint ? $constraint->{_compiled_type_constraint} : undef;
+    my $compiled_type_constraint = $constraint ? $constraint->_compiled_type_constraint : undef;
 
     my $self  = '$_[0]';
     my $key   = sprintf q{"%s"}, quotemeta $name;
@@ -41,11 +41,14 @@ sub _install_accessor{
         my $value = '$_[1]';
 
         if ($constraint) {
+            if(!$compiled_type_constraint){
+                Carp::confess("[BUG]Missing compiled type constraint for $constraint");
+            }
             if ($should_coerce) {
                 $accessor .=
                     "\n".
                     '#line ' . __LINE__ . ' "' . __FILE__ . "\"\n" .
-                    'my $val = Mouse::Util::TypeConstraints->typecast_constraints("'.$attribute->associated_class->name.'", $attribute->{type_constraint}, '.$value.');';
+                    'my $val = $constraint->coerce('.$value.');';
                 $value = '$val';
             }
             if ($compiled_type_constraint) {
@@ -171,22 +174,22 @@ sub _install_handles {
     foreach my $handle_name (keys %handles) {
         my $method_to_call = $handles{$handle_name};
 
-        my $code = sub {\r
-            my $instance = shift;\r
-            my $proxy    = $instance->$reader();\r
-\r
-            my $error = !defined($proxy)                ? ' is not defined'\r
-                      : ref($proxy) && !blessed($proxy) ? qq{ is not an object (got '$proxy')}\r
-                                                        : undef;\r
+        my $code = sub {
+            my $instance = shift;
+            my $proxy    = $instance->$reader();
+
+            my $error = !defined($proxy)                ? ' is not defined'
+                      : ref($proxy) && !blessed($proxy) ? qq{ is not an object (got '$proxy')}
+                                                        : undef;
             if ($error) {
-                $instance->meta->throw_error(\r
-                    "Cannot delegate $handle_name to $method_to_call because "\r
-                        . "the value of "\r
-                        . $attribute->name\r
+                $instance->meta->throw_error(
+                    "Cannot delegate $handle_name to $method_to_call because "
+                        . "the value of "
+                        . $attribute->name
                         . $error
-                 );\r
-            }\r
-            $proxy->$method_to_call(@_);\r
+                 );
+            }
+            $proxy->$method_to_call(@_);
         };
         $class->add_method($handle_name => $code);
     }