tentative attempt at version::fallback
[p5sagit/Module-Metadata.git] / lib / Module / Metadata.pm
index 2c0c6a6..6790052 100644 (file)
@@ -10,14 +10,23 @@ package Module::Metadata;
 # parrot future to look at other types of modules).
 
 use strict;
-use vars qw($VERSION);
+use vars qw($VERSION $V_CLASS);
 $VERSION = '1.000010';
 $VERSION = eval $VERSION;
 
 use Carp qw/croak/;
 use File::Spec;
 use IO::File;
-use version 0.87;
+use version;
+BEGIN {
+  $V_CLASS = 'version';
+  unless (eval { version->VERSION(0.87) }) {
+    require version::fallback;
+    version::fallback->VERSION(0.87);
+    version::fallback->import;
+    $V_CLASS = 'version::fallback';
+  }
+}
 BEGIN {
   if ($INC{'Log/Contextual.pm'}) {
     Log::Contextual->import('log_info');
@@ -61,6 +70,9 @@ my $VERS_REGEXP = qr{ # match a VERSION definition
   =[^=~]  # = but not ==, nor =~
 }x;
 
+my $PODSECT_REGEXP = qr{
+ ^=(cut|pod|head[1-4]|over|item|back|begin|end|for|encoding)\b
+}x;
 
 sub new_from_file {
   my $class    = shift;
@@ -97,8 +109,8 @@ sub new_from_module {
   
   my $compare_versions = sub {
     my ($v1, $op, $v2) = @_;
-    $v1 = version->new($v1)
-      unless UNIVERSAL::isa($v1,'version');
+    $v1 = $V_CLASS->new($v1)
+      unless UNIVERSAL::isa($v1,$V_CLASS);
   
     my $eval_str = "\$v1 $op \$v2";
     my $result   = eval $eval_str;
@@ -112,7 +124,7 @@ sub new_from_module {
     if ( $version =~ /[=<>!,]/ ) { # logic, not just version
       # take as is without modification
     }
-    elsif ( ref $version eq 'version' ) { # version objects
+    elsif ( ref $version eq $V_CLASS ) { # version objects
       $version = $version->is_qv ? $version->normal : $version->stringify;
     }
     elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
@@ -496,10 +508,9 @@ sub _parse_fh {
     my $line_num = $.;
 
     chomp( $line );
-    next if $line =~ /^\s*#/;
 
     my $is_cut;
-    if ( $line =~ /^=(.{0,3})/ ) {
+    if ( $line =~ /$PODSECT_REGEXP/o ) {
       $is_cut = $1 eq 'cut';
       $in_pod = !$is_cut;
     }
@@ -507,9 +518,9 @@ sub _parse_fh {
     # Would be nice if we could also check $in_string or something too
     last if !$in_pod && $line =~ /^__(?:DATA|END)__$/;
 
-    if ( $in_pod || $is_cut ) {
+    if ( $in_pod ) {
 
-      if ( $line =~ /^=head\d\s+(.+)\s*$/ ) {
+      if ( $line =~ /^=head[1-4]\s+(.+)\s*$/ ) {
        push( @pod, $1 );
        if ( $self->{collect_pod} && length( $pod_data ) ) {
           $pod{$pod_sect} = $pod_data;
@@ -517,16 +528,23 @@ sub _parse_fh {
         }
        $pod_sect = $1;
 
-
       } elsif ( $self->{collect_pod} ) {
        $pod_data .= "$line\n";
 
       }
 
-    } else {
+    } elsif ( $is_cut ) {
 
+      if ( $self->{collect_pod} && length( $pod_data ) ) {
+        $pod{$pod_sect} = $pod_data;
+        $pod_data = '';
+      }
       $pod_sect = '';
-      $pod_data = '';
+
+    } else {
+
+      # Skip comments in code
+      next if $line =~ /^\s*#/;
 
       # parse $line to see if it's a $VERSION declaration
       my( $vers_sig, $vers_fullname, $vers_pkg ) =
@@ -537,7 +555,7 @@ sub _parse_fh {
       if ( $line =~ /$PKG_REGEXP/o ) {
         $pkg = $1;
         push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs );
-        $vers{$pkg} = (defined $2 ? $2 : undef)  unless exists( $vers{$pkg} );
+        $vers{$pkg} = $2 unless exists( $vers{$pkg} );
         $need_vers = defined $2 ? 0 : 1;
 
       # VERSION defined with full package spec, i.e. $Module::VERSION
@@ -618,7 +636,7 @@ sub _evaluate_version_line {
   $pn++; # everybody gets their own package
   my $eval = qq{BEGIN { q#  Hide from _packages_inside()
     #; package Module::Metadata::_version::p$pn;
-    use version;
+    use $V_CLASS;
     no strict;
 
       \$vsub = sub {
@@ -697,12 +715,12 @@ sub _evaluate_version_line {
   sub _dwim_version {
     my ($result) = shift;
 
-    return $result if ref($result) eq 'version';
+    return $result if ref($result) eq $V_CLASS;
 
     my ($version, $error);
     for my $f (@version_prep) {
       $result = $f->($result);
-      $version = eval { version->new($result) };
+      $version = eval { $V_CLASS->new($result) };
       $error ||= $@ if $@; # capture first failure
       last if defined $version;
     }