summaryrefslogtreecommitdiff
path: root/lib/Parse
diff options
context:
space:
mode:
authorKenichi Ishigaki <ishigaki@cpan.org>2014-12-12 12:36:23 +0900
committerKenichi Ishigaki <ishigaki@cpan.org>2014-12-12 12:36:23 +0900
commitebba1f6486ce1662e55c23a311ed73140f809d13 (patch)
tree51760bd0d16cdeb5d600cd697522ded33c25ca83 /lib/Parse
parent85f96bd70caf998fed498b2c55984a4f06184355 (diff)
restore what are actually overloaded
Diffstat (limited to 'lib/Parse')
-rw-r--r--lib/Parse/PMFile.pm81
1 files changed, 29 insertions, 52 deletions
diff --git a/lib/Parse/PMFile.pm b/lib/Parse/PMFile.pm
index 5619694..82455f2 100644
--- a/lib/Parse/PMFile.pm
+++ b/lib/Parse/PMFile.pm
@@ -216,6 +216,7 @@ sub _parse_version {
$comp->deny(qw/enteriter iter unstack goto/); # minimum protection against Acme::BadExample
version->import('qv') if $self->{UNSAFE} || $UNSAFE;
+ $self->_store_overloaded_stuff;
{
no strict;
$v = ($self->{UNSAFE} || $UNSAFE) ? eval $eval : $comp->reval($eval);
@@ -265,6 +266,19 @@ sub _parse_version {
return $self->_normalize_version($v);
}
+sub _store_overloaded_stuff {
+ my $self = shift;
+ my %overloaded;
+ no strict 'refs';
+ for my $package (qw/version version::vpp charstar/) {
+ for my $op (qw/"" 0+ cmp <=> bool ++ -- + - * =/) {
+ my $key = "$package\::($op";
+ $overloaded{$key} = *{$key} if defined *{$key};
+ }
+ }
+ $self->{overloaded} = \%overloaded;
+}
+
sub _restore_overloaded_stuff {
my ($self, $used_version_in_safe) = @_;
return if $self->{UNSAFE} || $UNSAFE;
@@ -272,60 +286,23 @@ sub _restore_overloaded_stuff {
no strict 'refs';
no warnings 'redefine';
- # version XS in CPAN
- my $restored;
- if ($INC{'version/vxs.pm'}) {
- *{'version::(""'} = \&version::vxs::stringify;
- *{'version::(0+'} = \&version::vxs::numify;
- *{'version::(cmp'} = \&version::vxs::VCMP;
- *{'version::(<=>'} = \&version::vxs::VCMP;
- *{'version::(bool'} = \&version::vxs::boolean;
- $restored = 1;
+ for my $key (%{ $self->{overloaded} || {} }) {
+ *{$key} = $self->{overloaded}{$key} if $self->{overloaded}{$key};
}
- # version PP in CPAN
- if ($INC{'version/vpp.pm'}) {
- {
- package # hide from PAUSE
- charstar;
- overload->import;
- }
- if (!$used_version_in_safe) {
- package # hide from PAUSE
- version::vpp;
- overload->import;
- }
- unless ($restored) {
- *{'version::(""'} = \&version::vpp::stringify;
- *{'version::(0+'} = \&version::vpp::numify;
- *{'version::(cmp'} = \&version::vpp::vcmp;
- *{'version::(<=>'} = \&version::vpp::vcmp;
- *{'version::(bool'} = \&version::vpp::vbool;
- }
- *{'version::vpp::(""'} = \&version::vpp::stringify;
- *{'version::vpp::(0+'} = \&version::vpp::numify;
- *{'version::vpp::(cmp'} = \&version::vpp::vcmp;
- *{'version::vpp::(<=>'} = \&version::vpp::vcmp;
- *{'version::vpp::(bool'} = \&version::vpp::vbool;
- *{'charstar::(""'} = \&charstar::thischar;
- *{'charstar::(0+'} = \&charstar::thischar;
- *{'charstar::(++'} = \&charstar::increment;
- *{'charstar::(--'} = \&charstar::decrement;
- *{'charstar::(+'} = \&charstar::plus;
- *{'charstar::(-'} = \&charstar::minus;
- *{'charstar::(*'} = \&charstar::multiply;
- *{'charstar::(cmp'} = \&charstar::cmp;
- *{'charstar::(<=>'} = \&charstar::spaceship;
- *{'charstar::(bool'} = \&charstar::thischar;
- *{'charstar::(='} = \&charstar::clone;
- $restored = 1;
+ if ($self->{overloaded}{'version::(""'}) {
+ package #
+ version;
+ overload->import;
+ }
+ if ($self->{overloaded}{'charstar::(""'}) {
+ package #
+ charstar;
+ overload->import;
}
- # version in core
- if (!$restored) {
- *{'version::(""'} = \&version::stringify;
- *{'version::(0+'} = \&version::numify;
- *{'version::(cmp'} = \&version::vcmp;
- *{'version::(<=>'} = \&version::vcmp;
- *{'version::(bool'} = \&version::boolean;
+ if ($self->{overloaded}{'version::vpp::(""'} && !$used_version_in_safe) {
+ package #
+ version::vpp;
+ overload->import;
}
}