do not use Undef-Tolerant behaviour on attributes that are capable of handling undef
[gitmo/MooseX-UndefTolerant.git] / lib / MooseX / UndefTolerant / Constructor.pm
index 2463bf2..969faca 100644 (file)
@@ -12,18 +12,23 @@ if ( $Moose::VERSION < 1.9900 ) {
                 # insert a line of code at the start of the initializer,
                 # clearing the param if it's undefined.
 
-                if (defined $key_name) {
-                        my $tolerant_code =
-                             qq# delete \$params->{'$key_name'} unless # .
+                if (defined $key_name)
+                {
+                    # leave the value unscathed if the attribute's type constraint can
+                    # handle undef (or doesn't have one, which implicitly means it can)
+                    my $type_constraint = $self->_attributes->[$_[0]]->type_constraint;
+                    if ($type_constraint and not $type_constraint->check(undef))
+                    {
+                        my $tolerant_code = 
+                             qq# delete \$params->{'$key_name'} unless # . 
                              qq# exists \$params->{'$key_name'} && defined \$params->{'$key_name'};\n#;
 
                         return $tolerant_code . $self->$orig(@_);
+                    }
                 }
-                else {
-                        return $self->$orig(@_);
-                }
-        });
-}
+
+                return $self->$orig(@_);
+});
 
 no Moose::Role;