All:
Attached please find my first pass implementation of version object support for
Module::Build. This simple patch does the following:
1) adds an explicit dependency on version.pm as distributed on CPAN or in the
core in v5.10.0;
2) overrides the overloaded stringification operator so that whatever string the
original author used to define their $VERSION is what M::B will use as the
stringified representation (much better than the current hack of forcing the
numification to be used);
3) performs all version comparisons using version objects (so it handles alpha
releases automatically, for example).
As you can see, there isn't much to the patch, since I wanted to make the
minimal amount of changes required to get all current tests passing. I will
provide additional tests of the new functionality before I suggest that it be
integrated into the core.
Please let me know what you think.
John
--
John Peacock
Director of Information Research and Technology
Rowman & Littlefield Publishing Group
4501 Forbes Blvd
Suite H
Lanham, MD 20706
301-459-3366 x.5010
fax 301-429-5747
=== lib/Module/Build/Base.pm
==================================================================
--- lib/Module/Build/Base.pm (revision 1909)
+++ lib/Module/Build/Base.pm (local)
@@ -1232,11 +1232,9 @@
sub compare_versions {
my $self = shift;
my ($v1, $op, $v2) = @_;
+ $v1 = Module::Build::Version->new($v1)
+ unless UNIVERSAL::isa($v1,'Module::Build::Version');
- # for alpha versions - this doesn't cover all cases, but should work for
most:
- $v1 =~ s/_(\d+)\z/$1/;
- $v2 =~ s/_(\d+)\z/$1/;
-
my $eval_str = "\$v1 $op \$v2";
my $result = eval $eval_str;
$self->log_warn("error comparing versions: '$eval_str' $@") if $@;
=== lib/Module/Build/ModuleInfo.pm
==================================================================
--- lib/Module/Build/ModuleInfo.pm (revision 1909)
+++ lib/Module/Build/ModuleInfo.pm (local)
@@ -8,6 +8,7 @@
use File::Spec;
use IO::File;
+use Module::Build::Version;
my $PKG_REGEXP = qr/ # match a package declaration
@@ -283,23 +284,14 @@
$line
}; \$$var
};
- local $^W;
- # version.pm will change the ->VERSION method, so we mitigate the
- # potential effects here. Unfortunately local(*UNIVERSAL::VERSION)
- # will crash perl < 5.8.1. We also use * Foo::VERSION instead of
- # *Foo::VERSION so that old versions of CPAN.pm, etc. with a
- # too-permissive regex don't think we're actually declaring a
- # version.
-
- my $old_version = \&UNIVERSAL::VERSION;
- eval {require version};
+ local $^W;
+ # Try and get the $VERSION
my $result = eval $eval;
- * UNIVERSAL::VERSION = $old_version;
warn "Error evaling version line '$eval' in $self->{filename}: [EMAIL
PROTECTED]" if $@;
- # Unbless it if it's a version.pm object
- $result = $result->numify if UNIVERSAL::isa($result, 'version');
+ # Bless it into our own version class
+ $result = Module::Build::Version->new($result);
return $result;
}
=== lib/Module/Build/Version.pm
==================================================================
--- lib/Module/Build/Version.pm (revision 1909)
+++ lib/Module/Build/Version.pm (local)
@@ -0,0 +1,26 @@
+package Module::Build::Version;
+use base qw/version/;
+
+use overload (
+ '""' => \&stringify,
+);
+
+sub new {
+ my ($class, $value) = @_;
+ my $self = $class->SUPER::new($value);
+ $self->original($value);
+ return $self;
+}
+
+sub original {
+ my $self = shift;
+ $self->{original} = shift if @_;
+ return $self->{original};
+}
+
+sub stringify {
+ my $self = shift;
+ return $self->original;
+}
+
+1;