/usr/share/perl5/Poet/Cache.pm is in libpoet-perl 0.15-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | package Poet::Cache; ## no critic (Moose::RequireMakeImmutable)
$Poet::Cache::VERSION = '0.15';
use Poet qw($conf $poet);
use Method::Signatures::Simple;
use Moose;
extends 'CHI';
method initialize_caching () {
my $default_config =
{ defaults => { driver => 'File', root_dir => $poet->data_path("cache") } };
my $config = $conf->get_hash( 'cache' => $default_config );
__PACKAGE__->config($config);
}
1;
__END__
=pod
=head1 NAME
Poet::Cache -- Poet caching with CHI
=head1 SYNOPSIS
# In a conf file...
cache:
defaults:
driver: Memcached
servers: ["10.0.0.15:11211", "10.0.0.15:11212"]
# In a script...
use Poet::Script qw($cache);
# In a module...
use Poet qw($cache);
# In a component...
my $cache = $m->cache;
# For an arbitrary namespace...
my $cache = Poet::Cache->new(namespace => 'Some::Namespace')
# then...
my $customer = $cache->get($name);
if ( !defined $customer ) {
$customer = get_customer_from_db($name);
$cache->set( $name, $customer, "10 minutes" );
}
my $customer2 = $cache->compute($name2, "10 minutes", sub {
get_customer_from_db($name2)
});
=head1 DESCRIPTION
Poet::Cache is a subclass of L<CHI>. CHI provides a unified caching API over a
variety of storage backends, such as memory, plain files, memory mapped files,
memcached, and DBI.
Each package and Mason component uses its own CHI L<namespace|CHI/namespace> so
that caches remain separate.
=head1 CONFIGURATION
The Poet configuration entry 'cache', if any, will be passed to
L<Poet::Cache-E<gt>config()|CHI/SUBCLASSING AND CONFIGURING CHI>. This can go
in any L<Poet conf file|Poet::Conf/CONFIGURATION FILES>, e.g. C<local.cfg> or
C<global/cache.cfg>.
Here's a simple configuration that caches everything to files under
C<data/cache>. This is also the default if no configuration is present.
cache:
defaults:
driver: File
root_dir: ${root}/data/cache
Here's a more involved configuration that defines several "storage types" and
assigns each namespace a storage type.
cache:
defaults:
expires_variance: 0.2
storage:
file:
driver: File
root_dir: ${root}/data/cache
memcached:
driver: Memcached
servers: ["10.0.0.15:11211", "10.0.0.15:11212"]
compress_threshold: 4096
namespace:
/some/component: { storage: file, expires_in: 5min }
/some/other/component: { storage: memcached, expires_in: 1h }
Some::Library: { storage: memcached, expires_in: 10min }
Given the configuration above, and the code
package Some::Library;
use Poet qw($cache);
this C<$cache> will be created with properties
driver: Memcached
servers: ["10.0.0.15:11211", "10.0.0.15:11212"]
compress_threshold: 4096
expires_in: 10min
=head1 USAGE
=head2 Obtaining cache handle
=over
=item *
In a script (namespace will be 'main'):
use Poet::Script qw($cache);
=item *
In a module C<MyApp::Foo> (namespace will be 'MyApp::Foo'):
use Poet qw($cache);
=item *
In a component C</foo/bar> (namespace will be '/foo/bar'):
my $cache = $m->cache;
=item *
Manually for an arbitrary namespace:
my $cache = Poet::Cache->new(namespace => 'Some::Namespace');
# or
my $cache = MyApp::Cache->new(category => 'Some::Namespace');
=back
=head2 Using cache handle
my $customer = $cache->get($name);
if ( !defined $customer ) {
$customer = get_customer_from_db($name);
$cache->set( $name, $customer, "10 minutes" );
}
my $customer2 = $cache->compute($name2, "10 minutes", sub {
get_customer_from_db($name2)
});
See L<CHI|CHI> and L<Mason::Plugin::Cache|Mason::Plugin::Cache> for more
details.
=head1 MODIFIABLE METHODS
These methods are not intended to be called externally, but may be useful to
override or modify with method modifiers in L<subclasses|/Poet::Subclassing>.
=over
=item initialize_caching
Called once when the Poet environment is initialized. By default, calls C<<
__PACKAGE__->config >> with the configuration entry 'cache'.
=back
=head1 SEE ALSO
L<Poet|Poet>
=head1 AUTHOR
Jonathan Swartz <swartz@pobox.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Jonathan Swartz.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|