Preserve $_ (RT#66661)
[p5sagit/Class-C3-Componentised.git] / lib / Class / C3 / Componentised.pm
index 5506a15..a6a9c16 100644 (file)
@@ -47,9 +47,9 @@ use warnings;
 # Therefore leaving it in indefinitely.
 use MRO::Compat;
 
-use Carp;
+use Carp ();
 
-our $VERSION = 1.0007;
+our $VERSION = 1.0008;
 
 my $invalid_class = qr/(?: \b:\b | \:{3,} | \:\:$ )/x;
 
@@ -142,16 +142,16 @@ sub ensure_class_loaded {
     return if ( *{"${f_class}::$_"}{CODE} );
   }
 
-
   # require always returns true on success
-  eval { require($file) } or do {
+  # ill-behaved modules might very well obliterate $_
+  eval { local $_; require($file) } or do {
 
     $@ = "Invalid class name '$f_class'" if $f_class =~ $invalid_class;
 
     if ($class->can('throw_exception')) {
       $class->throw_exception($@);
     } else {
-      croak $@;
+      Carp::croak $@;
     }
   };
 
@@ -188,13 +188,10 @@ sub inject_base {
   my $class = shift;
   my $target = shift;
 
-  my %isa = map { $_ => 1 } ($target, @{mro::get_linear_isa($target)} );
-
   for (reverse @_) {
     no strict 'refs';
-    unless ($isa{$_}++) {
-      unshift ( @{"${target}::ISA"}, $_ );
-    }
+    unshift ( @{"${target}::ISA"}, $_ )
+      unless ($target eq $_ || $target->isa($_));
   }
 
   mro::set_mro($target, 'c3');