Cache::Memcachedにコールバック

なんかすでにありそう。
コードはSledge::Cacheのまんまパクリ。


package Cache::Memcached::CallBack;
use strict;
use warnings;
use base 'Cache::Memcached';

sub get_callback {
my ($self, $key, $callback, $expiry) = @_;

my $data = $self->get($key);
return $data if defined $data;

$data = $callback->();
$self->set( $key => $data , $expiry ) if defined $data;

return $data;
}

1;

↑の感じの拡張にすべきか
↓の感じの拡張にすべきか


package Cache::Memcached::CallBack;
use strict;
use warnings;

sub import {
my $self = shift;
no strict 'refs';
*{"Cache\::Memcached\::get_callback"} = \&get_callback;
}

sub get_callback {
my ($self, $key, $callback, $expiry) = @_;

my $data = $self->get($key);
return $data if defined $data;

$data = $callback->();
$self->set( $key => $data , $expiry ) if defined $data;

return $data;
}

1;

上の場合だと、


#! /usr/bin/perl
use strict;
use warnings;
use Cache::Memcached::CallBack;
use Proj::Data::User;
use Data::Dumper;

my $key = 'proj_user';

my $cache = Cache::Memcached::CallBack->new({
servers => [ '127.0.0.1:11211' ],
});

my $result = $cache->get_callback(
$key => sub { [ Proj::Data::User->retrieve(10) ] } , 5*60
);

warn Dumper $result;

下の場合だと


#! /usr/bin/perl
use strict;
use warnings;
use Cache::Memcached;
use Cache::Memcached::CallBack;
use Proj::Data::User;
use Data::Dumper;

my $key = 'proj_user';

my $cache = Cache::Memcached->new({
servers => [ '127.0.0.1:11211' ],
});

my $result = $cache->get_callback(
$key => sub { [ Proj::Data::User->retrieve(10) ] } , 5*60
);

warn Dumper $result;

こんな感じになる。

(追記)

本体にパッチるか。