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]も見る?)