package Cache::Memory::Simple; use strict; use warnings; use Time::HiRes; use 5.008001; our $VERSION = '1.03'; sub new { my ($class) = @_; bless {}, $class; } sub get { my ($self, $key) = @_; my $val = $self->{$key}; if (defined $val->[0]) { if ($val->[0] > Time::HiRes::time() ) { return $val->[1]; } else { delete $self->{$key}; # remove expired data return undef; } } else { return $val->[1]; } } sub get_or_set { my ($self, $key, $code, $expiration) = @_; if (my $val = $self->get($key)) { return $val; } else { my $val = $code->(); $self->set($key, $val, $expiration); return $val; } } sub set { my ($self, $key, $val, $expiration) = @_; $self->{$key} = [defined($expiration) ? $expiration + Time::HiRes::time() : undef, $val]; return $val; } sub delete :method { my ($self, $key) = @_; delete $self->{$key}; } sub remove { shift->delete(@_) } # alias sub delete_all { my $self = shift; delete $self->{$_} for keys %$self; return; } sub purge { my $self = shift; for my $key (keys %{$self}) { my $entry = $self->{$key}->[0]; if (defined($entry) && $entry < Time::HiRes::time() ) { delete $self->{$key}; } } } sub count { my $self = shift; return 0+keys %{$self}; } 1; __END__ =encoding utf8 =head1 NAME Cache::Memory::Simple - Yet another on memory cache =head1 SYNOPSIS use Cache::Memory::Simple; use feature qw/state/; sub get_stuff { my ($class, $key) = @_; state $cache = Cache::Memory::Simple->new(); $cache->get_or_set( $key, sub { Storage->get($key) # slow operation }, 10 # cache in 10 seconds ); } =head1 DESCRIPTION Cache::Memory::Simple is yet another on memory cache implementation. =head1 METHODS =over 4 =item C<< my $obj = Cache::Memory::Simple->new() >> Create a new instance. =item C<< my $stuff = $obj->get($key); >> Get a stuff from cache storage by C<< $key >> =item C<< $obj->set($key, $val, $expiration) >> Set a stuff for cache. =item C<< $obj->get_or_set($key, $code, $expiration) >> Get a cache value for I<$key> if it's already cached. If it's not cached then, run I<$code> and cache I<$expiration> seconds and return the value. =item C<< $obj->delete($key) >> Delete key from cache. =item C<< $obj->remove($key) >> Alias for 'delete' method(Net::DNS::Lite require this method name). =item C<< $obj->purge() >> Purge expired data. This module does not purge expired data automatically. You need to call this method if you need. =item C<< $obj->delete_all() >> Remove all data from cache. =back =head1 AUTHOR Tokuhiro Matsuno Etokuhirom AAJKLFJEF@ GMAIL COME =head1 SEE ALSO =head1 LICENSE Copyright (C) Tokuhiro Matsuno This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut