also test adding strictness in a subclass -- and fix mutable case (thanks doy!) :)
Karen Etheridge [Fri, 8 Apr 2011 17:55:46 +0000 (10:55 -0700)]
lib/MooseX/StrictConstructor/Trait/Class.pm
t/basic.t

index 0c73318..07f203a 100644 (file)
@@ -29,6 +29,18 @@ around '_inline_BUILDALL' => sub {
     );
 };
 
+# if the Object role is applied first, and then a superclass added, we just
+# lost our BUILDALL modification.
+after superclasses => sub
+{
+    my $self = shift;
+    return if not @_;
+    Moose::Util::MetaRole::apply_base_class_roles(
+        for => $self->name,
+        roles => ['MooseX::StrictConstructor::Role::Object'],
+    )
+};
+
 1;
 
 # ABSTRACT: A role to make immutable constructors strict
index 1738d92..04046d1 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -44,6 +44,17 @@ use Test::More;
 }
 
 {
+    package OtherStrictSubclass;
+
+    use Moose;
+    use MooseX::StrictConstructor;
+
+    extends 'Standard';
+
+    has 'size' => ( is => 'rw' );
+}
+
+{
     package Tricky;
 
     use Moose;
@@ -69,7 +80,7 @@ use Test::More;
     has 'size'  => ( is => 'rw', 'init_arg' => undef );
 }
 
-my @classes = qw( Standard Stricter Subclass StrictSubclass Tricky InitArg );
+my @classes = qw( Standard Stricter Subclass StrictSubclass OtherStrictSubclass Tricky InitArg );
 
 with_immutable {
     is(
@@ -106,6 +117,17 @@ with_immutable {
     );
 
     is(
+        exception { OtherStrictSubclass->new( thing => 1, size => 'large', ) }, undef,
+        'strict subclass from parent that doesn\'t use strict constructor handles known attributes correctly'
+    );
+
+    like(
+        exception { OtherStrictSubclass->new( thing => 1, bad => 99 ) },
+        qr/unknown attribute.+: bad/,
+        'strict subclass from parent that doesn\'t use strict correctly recognizes bad attribute'
+    );
+
+    is(
         exception { Tricky->new( thing => 1, spy => 99 ) }, undef,
         'can work around strict constructor by deleting params in BUILD()'
     );