Get rid of core XS dependencies noxs
Leon Timmermans [Fri, 30 Aug 2013 17:36:35 +0000 (19:36 +0200)]
Such as IO::File or Fcntl. This will enable Module::Metadata to run
using miniperl, also making cross compilation easier.

lib/Module/Metadata.pm

index 9e32dec..194ce55 100644 (file)
@@ -17,7 +17,12 @@ $VERSION = eval $VERSION;
 
 use Carp qw/croak/;
 use File::Spec;
-use IO::File;
+BEGIN {
+       # Try really hard to not depend ony any DynaLoaded module, such as IO::File or Fcntl
+       eval {
+               require Fcntl; Fcntl->import('SEEK_SET'); 1;
+       } or *SEEK_SET = sub { 0 }
+}
 use version 0.87;
 BEGIN {
   if ($INC{'Log/Contextual.pm'}) {
@@ -465,7 +470,7 @@ sub _parse_file {
   my $self = shift;
 
   my $filename = $self->{filename};
-  my $fh = IO::File->new( $filename )
+  open my $fh, '<', $filename
     or croak( "Can't open '$filename': $!" );
 
   $self->_handle_bom($fh, $filename);
@@ -478,11 +483,11 @@ sub _parse_file {
 sub _handle_bom {
   my ($self, $fh, $filename) = @_;
 
-  my $pos = $fh->getpos;
+  my $pos = tell $fh;
   return unless defined $pos;
 
   my $buf = ' ' x 2;
-  my $count = $fh->read( $buf, length $buf );
+  my $count = read $fh, $buf, length $buf;
   return unless defined $count and $count >= 2;
 
   my $encoding;
@@ -492,7 +497,7 @@ sub _handle_bom {
     $encoding = 'UTF-16LE';
   } elsif ( $buf eq "\x{EF}\x{BB}" ) {
     $buf = ' ';
-    $count = $fh->read( $buf, length $buf );
+    $count = read $fh, $buf, length $buf;
     if ( defined $count and $count >= 1 and $buf eq "\x{BF}" ) {
       $encoding = 'UTF-8';
     }
@@ -500,11 +505,10 @@ sub _handle_bom {
 
   if ( defined $encoding ) {
     if ( "$]" >= 5.008 ) {
-      # $fh->binmode requires perl 5.10
       binmode( $fh, ":encoding($encoding)" );
     }
   } else {
-    $fh->setpos($pos)
+    seek $fh, $pos, SEEK_SET
       or croak( sprintf "Can't reset position to the top of '$filename'" );
   }