s/Role::Meta/Trait/g
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor / Trait / Class.pm
diff --git a/lib/MooseX/StrictConstructor/Trait/Class.pm b/lib/MooseX/StrictConstructor/Trait/Class.pm
new file mode 100644 (file)
index 0000000..75dc3e0
--- /dev/null
@@ -0,0 +1,60 @@
+package MooseX::StrictConstructor::Trait::Class;
+
+use strict;
+use warnings;
+
+use B ();
+use Carp ();
+
+use Moose::Role;
+
+around '_inline_BUILDALL' => sub {
+    my $orig = shift;
+    my $self = shift;
+
+    my @source = $self->$orig();
+
+    my @attrs = (
+        '__INSTANCE__ => 1,',
+        map { B::perlstring($_) . ' => 1,' }
+        grep {defined}
+        map  { $_->init_arg() } $self->get_all_attributes()
+    );
+
+    return (
+        @source,
+        'my %attrs = (' . join(' ', @attrs) . ');',
+        'my @bad = sort grep { !$attrs{$_} } keys %{ $params };',
+        'if (@bad) {',
+            'Carp::confess "Found unknown attribute(s) passed to the constructor: @bad";',
+        '}',
+    );
+};
+
+no Moose::Role;
+
+1;
+
+# ABSTRACT: A role to make immutable constructors strict
+
+__END__
+
+=pod
+
+=head1 SYNOPSIS
+
+  Moose::Util::MetaRole::apply_metaroles(
+      for_class => $caller,
+      class     => {
+          constructor =>
+              ['MooseX::StrictConstructor::Trait::Method::Constructor'],
+      },
+  );
+
+=head1 DESCRIPTION
+
+This role simply wraps C<_inline_BUILDALL()> (from
+C<Moose::Meta::Class>) so that immutable classes have a
+strict constructor.
+
+=cut