die if somebody imports both Moo::Role and Moo into a package
Toby Inkster [Sun, 9 Dec 2012 09:37:34 +0000 (09:37 +0000)]
Changes
lib/Moo.pm
lib/Moo/Role.pm
t/not-both.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index c620ed8..fa108f3 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,7 @@
+
+
+  - Die if Moo and Moo::Role are imported into the same package
+
 1.000006 - 2012-11-16
   - Don't use $_ as loop variable when calling arbitrary code (RT#81072)
   - Bump Role::Tiny prereq to fix method modifier breakage on 5.10.0
index 962ff05..867869b 100644 (file)
@@ -22,8 +22,11 @@ sub import {
   my $target = caller;
   my $class = shift;
   strictures->import;
+  if ($Moo::Role::INFO{$target} and $Moo::Role::INFO{$target}{is_role}) {
+    die "Cannot import Moo into a role";
+  }
   return if $MAKERS{$target}; # already exported into this package
-  $MAKERS{$target} = {};
+  $MAKERS{$target} = { is_class => 1 };
   _install_tracked $target => extends => sub {
     $class->_set_superclasses($target, @_);
     $class->_maybe_reset_handlemoose($target);
index 61d66da..f823754 100644 (file)
@@ -20,8 +20,11 @@ sub import {
   my $target = caller;
   my ($me) = @_;
   strictures->import;
+  if ($Moo::MAKERS{$target} and $Moo::MAKERS{$target}{is_class}) {
+    die "Cannot import Moo::Role into a Moo class";
+  }
   return if $INFO{$target}; # already exported into this package
-  $INFO{$target} = {};
+  $INFO{$target} = { is_role => 1 };
   # get symbol table reference
   my $stash = do { no strict 'refs'; \%{"${target}::"} };
   _install_tracked $target => has => sub {
diff --git a/t/not-both.t b/t/not-both.t
new file mode 100644 (file)
index 0000000..8236490
--- /dev/null
@@ -0,0 +1,17 @@
+use strictures 1;
+use Test::More;
+
+# Compile-time exceptions, so need stringy eval; hence not Test::Fatal.
+{
+       local $@;
+       ok not eval q { package XXX; use Moo; use Moo::Role; 1; };
+       like $@, qr{Cannot import Moo::Role into a Moo class};
+}
+
+{
+       local $@;
+       ok not eval q { package YYY; use Moo::Role; use Moo; 1; };
+       like $@, qr{Cannot import Moo into a role};
+}
+
+done_testing;