diff options
author | Chris 'BinGOs' Williams <chris@bingosnet.co.uk> | 2018-08-20 11:15:20 +0100 |
---|---|---|
committer | Chris 'BinGOs' Williams <chris@bingosnet.co.uk> | 2018-08-20 11:15:20 +0100 |
commit | 9d890beed61e079102335ef5859d652b4e2c32ac (patch) | |
tree | b21f44cf2b892f0b5d9184145bd06dc82796611d | |
parent | 8d8d86ac0ac2f88ade8b2dd33f4c020fd007653d (diff) | |
download | perl-9d890beed61e079102335ef5859d652b4e2c32ac.tar.gz |
Update Time-Piece to CPAN version 1.33
[DELTA]
1.33 2018-08-18
- Allow objects in overloaded methods
-rwxr-xr-x | Porting/Maintainers.pl | 2 | ||||
-rw-r--r-- | cpan/Time-Piece/Piece.pm | 40 | ||||
-rw-r--r-- | cpan/Time-Piece/Seconds.pm | 2 | ||||
-rw-r--r-- | cpan/Time-Piece/t/06subclass.t | 15 |
4 files changed, 41 insertions, 18 deletions
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl index eaf9ed3262..a137ee9483 100755 --- a/Porting/Maintainers.pl +++ b/Porting/Maintainers.pl @@ -1208,7 +1208,7 @@ use File::Glob qw(:case); }, 'Time::Piece' => { - 'DISTRIBUTION' => 'ESAYM/Time-Piece-1.3204.tar.gz', + 'DISTRIBUTION' => 'ESAYM/Time-Piece-1.33.tar.gz', 'FILES' => q[cpan/Time-Piece], 'EXCLUDED' => [ qw[reverse_deps.txt] ], }, diff --git a/cpan/Time-Piece/Piece.pm b/cpan/Time-Piece/Piece.pm index 8acba86e76..d5624636c6 100644 --- a/cpan/Time-Piece/Piece.pm +++ b/cpan/Time-Piece/Piece.pm @@ -6,6 +6,7 @@ use XSLoader (); use Time::Seconds; use Carp; use Time::Local; +use Scalar::Util qw/ blessed /; use Exporter (); @@ -18,7 +19,7 @@ our %EXPORT_TAGS = ( ':override' => 'internal', ); -our $VERSION = '1.3204'; +our $VERSION = '1.33'; XSLoader::load( 'Time::Piece', $VERSION ); @@ -63,13 +64,27 @@ sub gmtime { $class->_mktime($time, 0); } + +# Check if the supplied param is either a normal array (as returned from +# localtime in list context) or a Time::Piece-like wrapper around one. +# +# We need to differentiate between an array ref that we can interrogate and +# other blessed objects (like overloaded values). +sub _is_time_struct { + return 1 if ref($_[1]) eq 'ARRAY'; + return 1 if blessed($_[1]) && $_[1]->isa('Time::Piece'); + + return 0; +} + + sub new { my $class = shift; my ($time) = @_; my $self; - if (ref($time)) { + if ($class->_is_time_struct($time)) { $self = $time->[c_islocal] ? $class->localtime($time) : $class->gmtime($time); } elsif (defined($time)) { @@ -106,10 +121,9 @@ sub parse { sub _mktime { my ($class, $time, $islocal) = @_; - $class = eval { (ref $class) && (ref $class)->isa('Time::Piece') } - ? ref $class - : $class; - if (ref($time)) { + $class = blessed($class) || $class; + + if ($class->_is_time_struct($time)) { my @new_time = @$time; my @tm_parts = (@new_time[c_sec .. c_mon], $new_time[c_year]+1900); $new_time[c_epoch] = $islocal ? timelocal(@tm_parts) : timegm(@tm_parts); @@ -639,7 +653,8 @@ sub cdate { sub str_compare { my ($lhs, $rhs, $reverse) = @_; - if (UNIVERSAL::isa($rhs, 'Time::Piece')) { + + if (blessed($rhs) && $rhs->isa('Time::Piece')) { $rhs = "$rhs"; } return $reverse ? $rhs cmp $lhs->cdate : $lhs->cdate cmp $rhs; @@ -652,9 +667,6 @@ use overload sub subtract { my $time = shift; my $rhs = shift; - if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { - $rhs = $rhs->seconds; - } if (shift) { @@ -667,7 +679,7 @@ sub subtract { return $rhs - "$time"; } - if (UNIVERSAL::isa($rhs, 'Time::Piece')) { + if (blessed($rhs) && $rhs->isa('Time::Piece')) { return Time::Seconds->new($time->epoch - $rhs->epoch); } else { @@ -679,10 +691,6 @@ sub subtract { sub add { my $time = shift; my $rhs = shift; - if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { - $rhs = $rhs->seconds; - } - croak "Invalid rhs of addition: $rhs" if ref($rhs); return $time->_mktime(($time->epoch + $rhs), $time->[c_islocal]); } @@ -692,7 +700,7 @@ use overload sub get_epochs { my ($lhs, $rhs, $reverse) = @_; - if (!UNIVERSAL::isa($rhs, 'Time::Piece')) { + unless (blessed($rhs) && $rhs->isa('Time::Piece')) { $rhs = $lhs->new($rhs); } if ($reverse) { diff --git a/cpan/Time-Piece/Seconds.pm b/cpan/Time-Piece/Seconds.pm index 3a56b74485..71a4bd27f2 100644 --- a/cpan/Time-Piece/Seconds.pm +++ b/cpan/Time-Piece/Seconds.pm @@ -1,7 +1,7 @@ package Time::Seconds; use strict; -our $VERSION = '1.3204'; +our $VERSION = '1.33'; use Exporter 5.57 'import'; diff --git a/cpan/Time-Piece/t/06subclass.t b/cpan/Time-Piece/t/06subclass.t index d6e4315c8f..a72cfb89ac 100644 --- a/cpan/Time-Piece/t/06subclass.t +++ b/cpan/Time-Piece/t/06subclass.t @@ -36,6 +36,21 @@ for my $method (qw(new localtime gmtime)) { } { + my $g = $class->gmtime; + my $l = $class->localtime; + + #via clone + my $l_clone = $class->new($l); + isa_ok($l_clone, $class, 'custom localtime via clone'); + cmp_ok("$l_clone", 'eq', "$l", 'Clones match'); + + #via clone with gmtime + my $g_clone = $class->new($g); + isa_ok($g_clone, $class, 'custom gmtime via clone'); + cmp_ok("$g_clone", 'eq', "$g", 'Clones match'); +} + +{ # let's verify that we can use gmtime from T::P without the export magic my $piece = Time::Piece::gmtime; isa_ok($piece, "Time::Piece", "object created via full-qualified gmtime"); |