CHI-Cascade
view release on metacpan or search on metacpan
lib/CHI/Cascade/Target.pm view on Meta::CPAN
package CHI::Cascade::Target;
use strict;
use warnings;
use Time::HiRes;
use Time::Duration::Parse;
sub new {
my ($class, %opts) = @_;
bless { %opts }, ref($class) || $class;
}
sub lock {
$_[0]->{locked} = $$;
}
sub locked {
exists $_[0]->{locked}
and $_[0]->{locked};
}
sub unlock {
delete $_[0]->{locked};
}
sub time {
$_[0]->{time} || 0;
}
sub touch {
$_[0]->{time} = Time::HiRes::time;
delete $_[0]->{finish_time};
delete $_[0]->{expires_finish_time};
}
sub actual_stamp {
$_[0]->{actual_stamp} = Time::HiRes::time;
}
sub is_actual {
( $_[0]->{actual_stamp} || $_[0]->{time} || 0 ) + $_[1] >= Time::HiRes::time;
}
sub ttl {
my $self = shift;
if (@_) {
$self->{finish_time} = ( $_[1] || Time::HiRes::time ) + $_[0];
return $self;
}
else {
return exists $self->{finish_time} && $self->{finish_time} ? $self->{finish_time} - Time::HiRes::time : undef;
}
}
sub expires {
my $self = shift;
my $expires = $_[0];
if (@_) {
return $expires
if $expires eq 'never' || $expires eq 'now';
$self->{expires_finish_time} = Time::HiRes::time + parse_duration( $expires );
return $expires;
}
else {
return
exists $self->{expires_finish_time} && $self->{expires_finish_time}
?
(
$self->{expires_finish_time} > Time::HiRes::time
?
int( $self->{expires_finish_time} - Time::HiRes::time + 0.5 ) || 'now'
:
'now'
)
:
undef;
}
}
1;
( run in 1.780 second using v1.01-cache-2.11-cpan-99c4e6809bf )