test path of compiling file rather than direct caller
[p5sagit/strictures.git] / lib / strictures.pm
index 2ef91fe..d986072 100644 (file)
@@ -5,7 +5,7 @@ use warnings FATAL => 'all';
 
 use constant _PERL_LT_5_8_4 => ($] < 5.008004) ? 1 : 0;
 
-our $VERSION = '1.004002'; # 1.4.2
+our $VERSION = '1.004004'; # 1.4.4
 
 sub VERSION {
   for ($_[1]) {
@@ -21,7 +21,7 @@ sub VERSION {
   shift->SUPER::VERSION(@_);
 }
 
-my $extra_load_states;
+our $extra_load_states;
 
 our $Smells_Like_VCS = (-e '.git' || -e '.svn'
   || (-e '../../dist.ini' && (-e '../../.git' || -e '../../.svn')));
@@ -30,6 +30,16 @@ sub import {
   strict->import;
   warnings->import(FATAL => 'all');
 
+  my $caller_file;
+  my $depth = 0;
+  while (my @caller = caller(++$depth)) {
+    if ($caller[3] =~ /::BEGIN$/) {
+      # older perls report the BEGIN in the wrong file
+      $caller_file = $depth > 1 ? (caller($depth-1))[1] : $caller[1];
+      $caller_file = $caller[1];
+    }
+  }
+
   my $extra_tests = do {
     if (exists $ENV{PERL_STRICTURES_EXTRA}) {
       if (_PERL_LT_5_8_4 and $ENV{PERL_STRICTURES_EXTRA}) {
@@ -38,7 +48,7 @@ sub import {
       }
       $ENV{PERL_STRICTURES_EXTRA};
     } elsif (! _PERL_LT_5_8_4) {
-      !!((caller)[1] =~ /^(?:t|xt|lib|blib)/
+      !!($caller_file =~ /^(?:t|xt|lib|blib)/
          and $Smells_Like_VCS)
     }
   };
@@ -46,13 +56,16 @@ sub import {
     $extra_load_states ||= do {
 
       my (%rv, @failed);
-      for my $mod (qw(indirect multidimensional bareword::filehandles)) {
+      foreach my $mod (qw(indirect multidimensional bareword::filehandles)) {
         eval "require $mod; \$rv{'$mod'} = 1;" or do {
           push @failed, $mod;
 
           # courtesy of the 5.8 require bug
-          $mod =~ s|::|/|g;
-          delete $INC{"$mod.pm"};
+          # (we do a copy because 5.16.2 at least uses the same read-only
+          # scalars for the qw() list and it doesn't seem worth a $^V check)
+
+          (my $file = $mod) =~ s|::|/|g;
+          delete $INC{"${file}.pm"};
         };
       }