概要: Plagger で他のプラグインを継承する場合の注意。
- [[Plagger 使って LastFM の最近聴いた音楽を Twitter に投稿する /post/50888698188]] に対して送られたトラックバック、
- エロチック街道@はてな - 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
メソッド書き直すことにはならない。と思う。
とりあえずメモ終わり。何かマズってたら教えてください。
#FIXME