package Seis::Instant; use strict; use warnings; use utf8; use 5.010_001; use overload ( q{""} => sub { "Instant:" . $_[0]->x }, q{eq} => sub { $_[0]->x eq $_[1]->x }, q{>} => sub { $_[0]->x > $_[1]->x }, q{<} => sub { $_[0]->x < $_[1]->x }, q{-} => sub { my ($x,$y,$reversed) = @_; if ($reversed) { ... } else { if (UNIVERSAL::isa($_[1], __PACKAGE__)) { Seis::Duration->_new($_[0]->x - $_[1]->x) } else { Seis::Instant->_new($x->{x} - $y); } } }, q{+} => sub { my ($x,$y,$reverse) = @_; if ($reverse) { Seis::Instant->_new($x->{x} + $y); } else { if (UNIVERSAL::isa($_[1], __PACKAGE__)) { Seis::Exception->throw("Instant + Instant is illegal"); } elsif (UNIVERSAL::isa($_[1], 'Seis::Duration')) { Seis::Instant->_new($x->{x} + $$y); } else { Seis::Instant->_new($x->{x} + $y); } } }, ); sub _new { my ($class, $x) = @_; bless {x => $x}, $class; } sub x { shift->{x} } sub fromーposix { my ($class, $x) = @_; $class->_new($x); } 1;