XML::Feedが外部から取得したデータをキャッシュしてくれないのでさせてみる
XML::Feed#parseにURIオブジェクトを渡すとURI::Fetchを使ってくれるんだけど、こいつがキャッシュしてくれない。オプションも渡せないので、無理くりやってる。
# 元のメソッドを取得 my $fetch = URI::Fetch->can('fetch'); # キャッシュオブジェクトを作る my $cache = Cache::FileCache->new( { namespace => $c->req->path, # CatalystでPath毎に分ける場合 default_expires_in => $default_expires_in, # 適当に } ); # URI::Fetchを上書きする no warnings qw(redefine); local *URI::Fetch::fetch = sub { if ( [caller 1]->[3] eq 'XML::Feed::parse' ) { # XML::Feed#parseから呼ばれていたら push @_, Cache => $cache; # fetchに渡す引数にCacheを追加 $_[1] = $_[1]->as_string; # (何だこれは…これが無いと動かなかったような気がしたんだが…気のせいかも) } return $fetch->(@_); # 元のメソッドを実行 }; # XML::Feedがキャッシュ使ってくれるようになったよー my $feed = XML::Feed->parse($url);
一応ポイントは if ( [caller 1]->[3] eq 'XML::Feed::parse' ) の部分で、XML::Feed#parse以外での予期しないキャッシュを防いでいます。(XML::Feed#parse内で予期しないURI::Fetchが実行されてたらダメか。行番号[caller]->[2]も見る?)