オブジェクト、特にビジネスロジックを書くときに、その結果をキャッシュに突っ込んでおくことがとにかく多い。
で、まぁそういう共通コードはベースクラスに入れておけばいいやって感じで書いてたんだけど、それももう5回目くらいになって最近もう本当にそれが面倒くさくなってきたので、丸ごとパッケージングした。それがMooseX::WithCache
話は単純で、要はcacheオブジェクトへのリファレンスをそれぞれのオブジェクトが持っていて、それに対するアクセスを簡単にするメソッドを生やしてやっているだけ。
package My::Thing;
use Moose;
use MooseX::WithCache;
with_cache 'cache'; # デフォルトはCache::Memcached
no Moose;
no MooseX::WithCache;
sub get_foo {
my $self = shift;
my $foo = $self->cache_get( 'foo' );
if (! $foo) {
$foo = $self->get_foo_from_database();
$self->cache_set(foo => $foo);
}
return $foo;
}
#main.pl
use My::Thing;
my $thing = My::Thing->new(
cache => Cache::Memcached->new({ servers => '127.0.0.1:11211' ])
);
my $foo = $thing->get_foo();
ってな感じで使う。
Mooseを使っているならhandlesでdelegationしてもいいようなものだけど、実はここでひとつキモがあって、ただそのままプロキシするんじゃなくて、キャッシュが本当に正しくあたっているのかとかを見るためにデバッグ機能をつけたり、復号キーをMD5形式にしたりと、意外とやることがおおいので、単純にhandlesでは処理できなかったのでこういう形になった。
先ほどCPANにdev releaseであげておいた。そのうちアップされるでしょう。コードはcodereposにもあるよ!
コメント