3 package Catalyst::Plugin::Cache;
4 use base qw/Class::Data::Inheritable/;
13 __PACKAGE__->mk_classdata( "_cache_backends" );
18 # set it once per app, not once per plugin,
19 # and don't overwrite if some plugin was wicked
20 $app->_cache_backends({}) unless $app->_cache_backends;
22 my $ret = $app->NEXT::setup( @_ );
24 $app->setup_cache_backends;
29 sub setup_cache_backends { shift->NEXT::setup_cache_backends(@_) }
36 $c->get_cache_backend($name);
38 $c->default_cache_backend;
42 sub get_cache_backend {
43 my ( $c, $name ) = @_;
44 $c->_cache_backends->{$name};
47 sub register_cache_backend {
48 my ( $c, $name, $backend ) = @_;
50 no warnings 'uninitialized';
51 Carp::croak("$backend does not look like a cache backend - "
52 . "it must be an object supporting get, set and delete")
53 unless eval { $backend->can("get") && $backend->can("set") && $backend->can("delete") };
55 $c->_cache_backends->{$name} = $backend;
58 sub unregister_cache_backend {
59 my ( $c, $name ) = @_;
60 delete $c->_cache_backends->{$name};
63 sub default_cache_backend {
65 $c->get_cache_backend( "default" ) || $c->temporary_cache_backend;
68 sub temporary_cache_backend {
70 die "FIXME - make up an in memory cache backend, that hopefully works well for the current engine";
73 # this gets a shit name so that the plugins can override a good name
74 sub choose_cache_backend_wrapper {
75 my ( $c, @meta ) = @_;
77 Carp::croak("meta data must be an even sized list") unless @meta % 2 == 0;
81 # allow the cache client to specify who it wants to cache with (but loeave room for a hook)
82 if ( exists $meta{backend} ) {
83 if ( Scalar::Util::blessed($meta{backend}) ) {
84 return $meta{backend};
86 return $c->get_cache_backend( $meta{backend} ) || $c->default_cache_backend;
91 $meta{caller} = [ caller(2) ] unless exists $meta{caller}; # might be interesting
93 if ( my $chosen = $c->choose_cache_backend( %meta ) ) {
94 $chosen = $c->get_cache_backend( $chosen ) unless Scalar::Util::blessed($chosen); # if it's a name find it
95 return $chosen if Scalar::Util::blessed($chosen); # only return if it was an object or name lookup worked
98 # die "no such backend"?
99 # currently, we fall back to default
102 return $c->default_cache_backend;
105 sub choose_cache_backend { shift->NEXT::choose_cache_backend( @_ ) } # a convenient fallback
108 my ( $c, $key, $value, @meta ) = @_;
109 $c->choose_cache_backend_wrapper( key => $key, value => $value, @meta )->set( $key, $value );
113 my ( $c, $key, @meta ) = @_;
114 $c->choose_cache_backend_wrapper( key => $key, @meta )->get( $key );
118 my ( $c, $key, @meta ) = @_;
119 $c->choose_cache_backend_wrapper( key => $key, @meta )->delete( $key );
130 Catalyst::Plugin::Cache -
134 use Catalyst::Plugin::Cache;