X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FFile%2Fstat.pm;h=132cbee27ada7bb6691b1dd631997b455033db44;hb=68c65ec0adda9d2b3fc21f30f68be0ef10de5ad8;hp=82cb3f6df3baaee5ef569da865c1221122d2b0a5;hpb=72451f4af0d31f24ef5b12bc5d034e3e8b35d43d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/File/stat.pm b/lib/File/stat.pm index 82cb3f6..132cbee 100644 --- a/lib/File/stat.pm +++ b/lib/File/stat.pm @@ -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 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