another TODO note, re crazy init_arg strings
[gitmo/MooseX-UndefTolerant.git] / lib / MooseX / UndefTolerant / Class.pm
index 3aa9ac0..a243605 100644 (file)
@@ -7,6 +7,9 @@ use warnings;
 
 use Moose::Role;
 
+# TODO: this code should be in the attribute trait, in the inlined version of
+# initialize_instance_slot, but this does not yet exist!
+
 around _inline_init_attr_from_constructor => sub {
     my $orig = shift;
     my $self = shift;
@@ -15,13 +18,20 @@ around _inline_init_attr_from_constructor => sub {
     my @source = $self->$orig(@_);
 
     my $init_arg = $attr->init_arg;
-
-    return
-        "if ( exists \$params->{$init_arg} && defined \$params->{$init_arg} ) {",
-            @source,
+    my $type_constraint = $attr->type_constraint;
+    my $tc_says_clean = ($type_constraint && !$type_constraint->check(undef) ? 1 : 0);
+
+    # 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};",
-        '}';
+            "delete \$params->{'$init_arg'};",
+        '}',
+        ) : (),
+    );
 };
 
 no Moose::Role;