another TODO note, re crazy init_arg strings
[gitmo/MooseX-UndefTolerant.git] / lib / MooseX / UndefTolerant / Class.pm
index c8bd25c..a243605 100644 (file)
@@ -1,25 +1,38 @@
 package MooseX::UndefTolerant::Class;
+
+# applied to metaclass, for Moose >= 1.9900
+
+use strict;
+use warnings;
+
 use Moose::Role;
 
-if ( $Moose::VERSION >= 1.9900 ) {
-        around('_inline_init_attr_from_constructor', sub {
-                my $orig = shift;
-                my $self = shift;
-                my ($attr, $idx) = @_;
+# TODO: this code should be in the attribute trait, in the inlined version of
+# initialize_instance_slot, but this does not yet exist!
 
-                my @source = $self->$orig(@_);
+around _inline_init_attr_from_constructor => sub {
+    my $orig = shift;
+    my $self = shift;
+    my ($attr, $idx) = @_;
 
-                my $init_arg = $attr->init_arg;
+    my @source = $self->$orig(@_);
 
-                return
-                        "if ( exists \$params->{$init_arg} && defined \$params->{$init_arg} ) {",
-                                @source,
-                        '} else {',
-                               "delete \$params->{$init_arg};",
-                        '}';
-        });
-}
+    my $init_arg = $attr->init_arg;
+    my $type_constraint = $attr->type_constraint;
+    my $tc_says_clean = ($type_constraint && !$type_constraint->check(undef) ? 1 : 0);
 
-no Moose::Role;
+    # FIXME: not properly sanitizing field names - e.g. consider a field name "Z'ha'dum"
+    return ($tc_says_clean ? (
+        "if ( exists \$params->{'$init_arg'} && defined \$params->{'$init_arg'} ) {",
+        ) : (),
+        @source,
+        $tc_says_clean ? (
+        '} else {',
+            "delete \$params->{'$init_arg'};",
+        '}',
+        ) : (),
+    );
+};
 
+no Moose::Role;
 1;