Re: [perl #41555] Bug in File::Find on Windows when target
[p5sagit/p5-mst-13.2.git] / lib / File / stat.pm
index 82cb3f6..132cbee 100644 (file)
@@ -1,10 +1,15 @@
 package File::stat;
+use 5.006;
+
 use strict;
+use warnings;
+
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+our $VERSION = '1.00';
 
 BEGIN { 
     use Exporter   ();
-    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-    @ISA         = qw(Exporter);
     @EXPORT      = qw(stat lstat);
     @EXPORT_OK   = qw( $st_dev    $st_ino    $st_mode 
                       $st_nlink   $st_uid    $st_gid 
@@ -14,9 +19,12 @@ BEGIN {
                    );
     %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
 }
-use vars      @EXPORT_OK;
+use vars @EXPORT_OK;
 
-use Class::Template qw(struct);
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
 struct 'File::stat' => [
      map { $_ => '$' } qw{
         dev ino mode nlink uid gid rdev size
@@ -40,9 +48,15 @@ sub stat ($) {
     my $arg = shift;
     my $st = populate(CORE::stat $arg);
     return $st if $st;
-    no strict 'refs';
-    require Symbol;
-    return populate(CORE::stat \*{Symbol::qualify($arg)});
+       my $fh;
+    {
+               local $!;
+               no strict 'refs';
+               require Symbol;
+               $fh = \*{ Symbol::qualify( $arg, caller() )};
+               return unless defined fileno $fh;
+       }
+    return populate(CORE::stat $fh);
 }
 
 1;
@@ -101,9 +115,23 @@ function functions with their full qualified names.
 On the other hand, the built-ins are still available
 via the C<CORE::> pseudo-package.
 
+=head1 BUGS
+
+As of Perl 5.8.0 after using this module you cannot use the implicit
+C<$_> or the special filehandle C<_> with stat() or lstat(), trying
+to do so leads into strange errors.  The workaround is for C<$_> to
+be explicit
+
+    my $stat_obj = stat $_;
+
+and for C<_> to explicitly populate the object using the unexported
+and undocumented populate() function with CORE::stat():
+
+    my $stat_obj = File::stat::populate(CORE::stat(_));
+
 =head1 NOTE
 
-While this class is currently implemented using the Class::Template
+While this class is currently implemented using the Class::Struct
 module to build a struct-like class, you shouldn't rely upon this.
 
 =head1 AUTHOR