MXSC must be used by Moose classes, nothing else
Ricardo Signes [Wed, 18 May 2011 18:14:20 +0000 (14:14 -0400)]
Changes
lib/MooseX/StrictConstructor.pm
t/basic.t

diff --git a/Changes b/Changes
index 9590625..985bf3e 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,7 @@
 {{$NEXT}}
 
+- Throw an error when used by a non-class; it won't do what users think
+
 0.16     2011-04-22
 
 - Don't wrap BUILDALL, since this breaks if the object doesn't inherit from
index 40fa4bb..80e8453 100644 (file)
@@ -20,6 +20,16 @@ use Moose::Util::MetaRole;
     Moose::Exporter->setup_import_methods(
         class_metaroles => \%class_meta,
     );
+
+    my $old_import = __PACKAGE__->can('import');
+    no warnings 'redefine';
+    *import = sub {
+      my $caller = caller;
+      Carp::croak "$_[0] can only be applied to Moose classes"
+        unless eval { $caller->meta->isa('Moose::Meta::Class') };
+
+      goto &$old_import;
+    };
 }
 
 1;
index f69201f..b159e77 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -80,6 +80,26 @@ use Test::More;
     has 'size'  => ( is => 'rw', 'init_arg' => undef );
 }
 
+{
+    local $@;
+    eval q[package MyRole; use Moose::Role; use MooseX::StrictConstructor;];
+    like(
+        $@,
+        qr/can only be applied to Moose classes/,
+        "can't apply MXSC to a role"
+    );
+}
+
+{
+    local $@;
+    eval q[package Nothing; use MooseX::StrictConstructor;];
+    like(
+        $@,
+        qr/can only be applied to Moose classes/,
+        "can't apply MXSC to a random package",
+    );
+}
+
 my @classes
     = qw( Standard Stricter Subclass StrictSubclass OtherStrictSubclass Tricky InitArg );