use version;
sub require {
- my ($filename) = @_;
- if ( my $version = eval { version->parse($filename) } ) {
- if ( $version > $^V ) {
- my $vn = $version->normal;
- croak "Perl $vn required--this is only $^V, stopped";
- }
- return 1;
- }
- if (exists $INC{$filename}) {
- return 1 if $INC{$filename};
- croak "Compilation failed in require";
- }
- my ($realfilename,$result);
- ITER: {
- foreach $prefix (@INC) {
- $realfilename = "$prefix/$filename";
- if (-f $realfilename) {
- $INC{$filename} = $realfilename;
- my $caller = caller;
- my $do_as_caller = eval qq{
- package $caller;
- sub { do \$_[0] }
- };
- $result = $do_as_caller->($realfilename);
- last ITER;
- }
- }
- croak "Can't locate $filename in \@INC";
- }
- if ($@) {
- $INC{$filename} = undef;
- croak $@;
- } elsif (!$result) {
- delete $INC{$filename};
- croak "$filename did not return true value";
- } else {
- $! = 0;
- return $result;
- }
+ my ($filename) = @_;
+ if ( my $version = eval { version->parse($filename) } ) {
+ if ( $version > $^V ) {
+ my $vn = $version->normal;
+ croak "Perl $vn required--this is only $^V, stopped";
+ }
+ return 1;
+ }
+
+ if (exists $INC{$filename}) {
+ return 1 if $INC{$filename};
+ croak "Compilation failed in require";
+ }
+
+ foreach $prefix (@INC) {
+ if (ref($prefix)) {
+ #... do other stuff - see text below ....
+ }
+ # (see text below about possible appending of .pmc
+ # suffix to $filename)
+ my $realfilename = "$prefix/$filename";
+ next if ! -e $realfilename || -d _ || -b _;
+ $INC{$filename} = $realfilename;
+ my $result = do($realfilename); # but run in caller's namespace
+
+ if (!defined $result) {
+ $INC{$filename} = undef;
+ croak $@ ? "$@Compilation failed in require"
+ : "Can't locate $filename: $!\n";
+ }
+ if (!$result) {
+ delete $INC{$filename};
+ croak "$filename did not return true value";
+ }
+ $! = 0;
+ return $result;
+ }
+ croak "Can't locate $filename in \@INC ...";
}
Note that the file will not be included twice under the same specified