Redid this as (mostly) roles which are applied at runtime to the meta
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor / Role / Object.pm
diff --git a/lib/MooseX/StrictConstructor/Role/Object.pm b/lib/MooseX/StrictConstructor/Role/Object.pm
new file mode 100644 (file)
index 0000000..cefb342
--- /dev/null
@@ -0,0 +1,60 @@
+package MooseX::StrictConstructor::Role::Object;
+
+use strict;
+use warnings;
+
+use Moose::Role;
+
+
+after 'BUILDALL' => sub
+{
+    my $self   = shift;
+    my $params = shift;
+
+    my %attrs =
+        ( map { $_ => 1 }
+          grep { defined }
+          map { $_->init_arg() }
+          $self->meta()->compute_all_applicable_attributes()
+        );
+
+    my @bad = sort grep { ! $attrs{$_} }  keys %{ $params };
+
+    if (@bad)
+    {
+        confess "Found unknown attribute(s) init_arg passed to the constructor: @bad";
+    }
+
+    return;
+};
+
+no Moose::Role;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Object::StrictConstructor - Implements strict constructors as a Moose::Object subclass
+
+=head1 DESCRIPTION
+
+This class has no external interface. When you use
+C<MooseX::StrictConstructor>, your objects will subclass this class
+rather than Moose::Object.
+
+=head1 AUTHOR
+
+Dave Rolsky, C<< <autarch@urth.org> >>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2007 Dave Rolsky, All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut