# --------------------------------------------------------- # This code is largely based on DeWitt Clinton's # Cache::MemoryCache. It relies upon the fact that we have # ferreted out the calls to Clone_Data(). # --------------------------------------------------------- package Cache::FastMemoryCache; use 5.006; use strict; use warnings; our $VERSION = 0.01; use base qw ( Cache::BaseCache ); use Cache::CacheUtils qw( Assert_Defined Static_Params ); use Cache::FastMemoryBackend; sub Clear { foreach my $namespace ( _Namespaces( ) ) { _Get_Backend( )->delete_namespace( $namespace ); } } sub Purge { foreach my $namespace ( _Namespaces( ) ) { _Get_Cache( $namespace )->purge( ); } } sub Size { my $size = 0; foreach my $namespace ( _Namespaces( ) ) { $size += _Get_Cache( $namespace )->size( ); } return $size; } sub _Get_Backend { return new Cache::MemoryBackend( ); } sub _Namespaces { return _Get_Backend( )->get_namespaces( ); } sub _Get_Cache { my ( $p_namespace ) = Static_Params( @_ ); Assert_Defined( $p_namespace ); return new Cache::MemoryCache( { 'namespace' => $p_namespace } ); } sub new { my ( $self ) = _new( @_ ); $self->_complete_initialization( ); return $self; } sub _new { my ( $proto, $p_options_hash_ref ) = @_; my $class = ref( $proto ) || $proto; my $self = $class->SUPER::_new( $p_options_hash_ref ); $self->_set_backend( new Cache::FastMemoryBackend( ) ); return $self; } sub set_object { my ( $self, $p_key, $p_object ) = @_; my $object = $p_object; # no clone $object->set_size( undef ); $object->set_key( undef ); $self->_get_backend( )->store( $self->get_namespace( ), $p_key, $object ); } 1; __END__ =head1 NAME Cache::FastMemoryCache - In-memory cache of arbitrary data. =head1 SYNOPSIS use Cache::FastMemoryCache; my $cache = new Cache::FastMemoryCache({ 'namespace' => 'MyNamespace' }); $key = 'xxx'; $href->{'name'} = 'old name'; $cache->set( $key, $href ); # insert into cache. $href->{'name'} = 'new name'; # modify it after insert. # Later... $href = $cache->get($key); print $href->{'name'}; # prints "new name" =head1 DESCRIPTION Cache::FastMemoryCache is an in-memory cache, implemented as an extension to the excellent Cache::Cache suite. All cached items are stored per-process. The cache does not persist after the process dies. It is the fastest of all the Cache::* types because it does not perform deep copying of data. =head1 METHODS See Cache::Cache for the API. =head1 CAVEATS The other Cache::* types make deep copies of data before inserting it into the cache -- FastMemoryCache does not make copies. The example in the SYNOPSIS section of this manual prints "new name" with FastMemoryCache, but prints "old name" with other cache types! =head1 AUTHOR John Millaway Emillaway@acm.orgE (Based heavily on DeWitt Clinton's Cache::MemoryCache module.) =head1 SEE ALSO Cache::Cache, Cache::MemoryCache. =cut