package Cache::LRU { use Hash::Ordered; use Moose; use MooseX::Types::Common::Numeric qw/PositiveOrZeroInt/; use Carp ‘croak’; use namespace::autoclean; has '_cache' => ( is => 'ro', isa => 'Hash::Ordered', default => sub { Hash::Ordered->new }, ); has 'max_size' => ( is => 'ro', isa => PositiveOrZeroInt, default => 20, ); sub set { croak('…') unless @_ == 3; my ( $self, $key, $value ) = @_; if ( $self->_cache->exists($value) ) { $self->_cache->delete($value); } elsif ( $self->_cache->keys > $self->max_size ) { $self->_cache->shift; } $self->_cache->set( $key, $value ); } sub get { croak('…') unless @_ == 2; my ( $self, $key ) = @_; if ( $self->{cache}->exists($key) ) { my $value = $self->_cache->delete($key); $self->_cache->set($key,$value); return $value; } return; } __PACKAGE__->meta->make_immutable; }