カラクリスタ

『輝かしい青春』なんて失かったヒトのブログ

Plaggerで他のプラグインを継承するときの注意というかメモ

概要: Plaggerで他のプラグインを継承する場合の注意。


Plagger使ってLastFMの最近聴いた音楽をTwitterに投稿するに対して送られたトラックバック、 エロチック街道@はてな - Publish::Twitterで日本語を投稿する で突っ込まれたことなんだけど、既存のPlaggerのプラグインを書き換える場合、対象となるプラグインを継承してから、 目的の部分を書き換える、というほうがいいみたい。で、それはいいんだけど、 実際にその方法でやったらちょっとはまったので、それをメモ。

既存のPlaggerプラグインを継承する場合、registerメソッドの書き方によっては、 registerメソッドを書き直さないと動かない。

例を挙げると、継承元のregisterメソッドで、

sub register {
    my ( $self, $context ) = @_;
    $context->register_hook(
        $self,
        'subscription.load' => \&load,
    )
}

のようにメソッドのリファレンスが直接指定されている場合、どうも継承元が呼び出されるっぽい。 たぶんこのあたりの挙動については、Plaggerがどうのこうのというより、 Perlの継承とかリファレンスがどうとかそのあたりだと思う。

で、逆に、

sub register {
    my ( $self, $context ) = @_;
    $context->register_hook(
        $self,
        'subscription.load' => $self->can('load'),
    )
}

のようにcanメソッド使ってる場合、問題ないみたい。 実際にSubscription::XPathはcanが使われていて、それを継承しているSubscription::XOXOは問題なさそう。 (実際には動かしてない。多分問題ないはず。)

で、思ったんだけど、実際にPlaggerのプラグイン書くときは継承されることも考えて、 フックに登録するときはcanメソッド使ったほうがいいかも。 すくなくともregisterメソッド書き直すことにはならない。と思う。

とりあえずメモ終わり。何かマズってたら教えてください。