clean undef-tolerant and undefined args in BUILDARGS
[gitmo/MooseX-UndefTolerant.git] / lib / MooseX / UndefTolerant / Object.pm
diff --git a/lib/MooseX/UndefTolerant/Object.pm b/lib/MooseX/UndefTolerant/Object.pm
new file mode 100644 (file)
index 0000000..6e18fa8
--- /dev/null
@@ -0,0 +1,30 @@
+package MooseX::UndefTolerant::Object;
+
+# applied to class.
+
+use strict;
+use warnings;
+
+use Moose::Role;
+
+around BUILDARGS => sub {
+    my ($orig, $class, @args) = @_;
+
+    my $args = $class->$orig(@args);
+
+    my @delete_keys = grep
+    {
+        defined $_->init_arg
+        and exists $args->{$_->init_arg}
+        and not defined $args->{$_->init_arg}
+        and do {
+            my $type_constraint = $_->type_constraint;
+            $type_constraint and not $type_constraint->check(undef)
+        }
+    } Moose::Util::find_meta($class)->get_all_attributes();
+
+    delete @{$args}{@delete_keys} if @delete_keys;
+    return $args;
+};
+
+1;