Changelogging
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Accessor.pm
index 4d7e3a9..eb9152d 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;
@@ -40,29 +40,23 @@ sub _install_accessor{
                 
         my $value = '$_[1]';
 
-        if ($constraint) {
+        if (defined $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) {
-                $accessor .= 
-                    "\n".
-                    '#line ' . __LINE__ . ' "' . __FILE__ . "\"\n" .
-                    'unless ($compiled_type_constraint->('.$value.')) {
-                        $attribute->verify_type_constraint_error($name, '.$value.', $attribute->{type_constraint});
-                    }' . "\n";
-            } else {
-                $accessor .= 
-                    "\n".
-                    '#line ' . __LINE__ . ' "' . __FILE__ . "\"\n" .
-                    'unless ($constraint->check('.$value.')) {
-                        $attribute->verify_type_constraint_error($name, '.$value.', $attribute->{type_constraint});
-                    }' . "\n";
-            }
+            $accessor .= 
+                "\n".
+                '#line ' . __LINE__ . ' "' . __FILE__ . "\"\n" .
+                'unless ($compiled_type_constraint->('.$value.')) {
+                    $attribute->verify_type_constraint_error($name, '.$value.', $attribute->{type_constraint});
+                }' . "\n";
         }
 
         # if there's nothing left to do for the attribute we can return during
@@ -91,11 +85,16 @@ sub _install_accessor{
     if ($attribute->is_lazy) {
         $accessor .= $self.'->{'.$key.'} = ';
 
-        $accessor .= $attribute->has_builder
-                ? $self.'->$builder'
-                    : ref($default) eq 'CODE'
-                    ? '$default->('.$self.')'
-                    : '$default';
+        if($should_coerce && defined($constraint)){
+            $accessor .= '$attribute->_coerce_and_verify(';
+        }
+        $accessor .=   $attribute->has_builder ? $self.'->$builder'
+                     : ref($default) eq 'CODE' ? '$default->('.$self.')'
+                     :                           '$default';
+
+        if($should_coerce && defined $constraint){
+            $accessor .= ')';
+        }
         $accessor .= ' if !exists '.$self.'->{'.$key.'};' . "\n";
     }