this shouldn't be using a base class role at all
Jesse Luehrs [Fri, 22 Apr 2011 16:12:39 +0000 (11:12 -0500)]
also, "after BUILDALL" is terrible

lib/MooseX/StrictConstructor.pm
lib/MooseX/StrictConstructor/Role/Object.pm [deleted file]
lib/MooseX/StrictConstructor/Trait/Class.pm

index c68d279..40fa4bb 100644 (file)
@@ -6,7 +6,6 @@ use warnings;
 use Moose 0.94 ();
 use Moose::Exporter;
 use Moose::Util::MetaRole;
-use MooseX::StrictConstructor::Role::Object;
 
 {
     my %class_meta = ( class => ['MooseX::StrictConstructor::Trait::Class'] );
@@ -19,8 +18,7 @@ use MooseX::StrictConstructor::Role::Object;
     }
 
     Moose::Exporter->setup_import_methods(
-            class_metaroles  => \%class_meta,
-            base_class_roles => ['MooseX::StrictConstructor::Role::Object'],
+        class_metaroles => \%class_meta,
     );
 }
 
diff --git a/lib/MooseX/StrictConstructor/Role/Object.pm b/lib/MooseX/StrictConstructor/Role/Object.pm
deleted file mode 100644 (file)
index 4b5a765..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package MooseX::StrictConstructor::Role::Object;
-
-use Moose::Role;
-
-use namespace::autoclean;
-
-after 'BUILDALL' => sub {
-    my $self   = shift;
-    my $params = shift;
-
-    my %attrs = (
-        __INSTANCE__ => 1,
-        map { $_ => 1 }
-        grep {defined}
-        map  { $_->init_arg() } $self->meta()->get_all_attributes()
-    );
-
-    my @bad = sort grep { !$attrs{$_} } keys %{$params};
-
-    if (@bad) {
-        Moose->throw_error(
-            "Found unknown attribute(s) init_arg passed to the constructor: @bad");
-    }
-
-    return;
-};
-
-1;
-
-# ABSTRACT: A role which implements a strict constructor for Moose::Object
-
-__END__
-
-=pod
-
-=head1 SYNOPSIS
-
-  Moose::Util::MetaRole::apply_base_class_roles(
-      for_class => $caller,
-      roles =>
-          ['MooseX::StrictConstructor::Role::Object'],
-  );
-
-=head1 DESCRIPTION
-
-When you use C<MooseX::StrictConstructor>, your objects will have this
-role applied to them. It provides a method modifier for C<BUILDALL()>
-from C<Moose::Object> that implements strict argument checking for
-your class.
-
-=cut
index 579b6c2..99803d2 100644 (file)
@@ -6,6 +6,30 @@ use namespace::autoclean;
 
 use B ();
 
+around new_object => sub {
+    my $orig = shift;
+    my $self = shift;
+    my $params = @_ == 1 ? $_[0] : {@_};
+    my $instance = $self->$orig(@_);
+
+    my %attrs = (
+        __INSTANCE__ => 1,
+        (map { $_ => 1 }
+             grep { defined }
+                  map { $_->init_arg }
+                      $self->get_all_attributes)
+    );
+
+    my @bad = sort grep { !$attrs{$_} } keys %$params;
+
+    if (@bad) {
+        $self->throw_error(
+            "Found unknown attribute(s) init_arg passed to the constructor: @bad");
+    }
+
+    return $instance;
+};
+
 around '_inline_BUILDALL' => sub {
     my $orig = shift;
     my $self = shift;
@@ -29,19 +53,6 @@ around '_inline_BUILDALL' => sub {
     );
 } if $Moose::VERSION >= 1.9900;
 
-# If the base class role is applied first, and then a superclass is added, we
-# lose the role.
-after superclasses => sub {
-    my $self = shift;
-
-    return unless @_;
-
-    Moose::Util::MetaRole::apply_base_class_roles(
-        for   => $self->name(),
-        roles => ['MooseX::StrictConstructor::Role::Object'],
-    );
-};
-
 1;
 
 # ABSTRACT: A role to make immutable constructors strict