# 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');
=[^=~] # = 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;
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;
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
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;
}
# 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;
}
$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 ) =
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
$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 {
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;
}