2006-11-24
Plagger 0.7.15 の中身
食わず嫌いで Plagger を敬遠していたんですが,ついにインストールしました。しかし自分がやりたいことをやるには既存のプラグインだけでは無理そう。で,とりあえず既存のプラグインのコードを読んでいたらどんどんわからなくなってしまいました。
資料をあさっていたら,Shibuya.Plaggers に Plaggerの中身 - file-glob こと k.daibaの日記 という記事が紹介されているのを発見。そうそうこういう構造説明書がほしかったんですよ。
しかし既存のプラグインのソースを見ているとどうも勝手が違うみたいなので Plagger::run() の中身を読むことにしました。0.7.15 での内部構造を id:kdaiba さん記法で書き下してみます。
autoload_plugin('Bundle::Defaults')
plugin.init
subscription.load
for feed (subscription->feeds)
if (defined feed->aggregator)
feed->aggregator
else
customfeed.handle
if (failed)
subscription->delete_feed(feed)
aggregator.finalize
for feed (update->feeds)
for entry (feed->entries)
update.entry.fixup
update.feed.fixup
update.fixup
smartfeed.init
for feed (update->feeds)
for entry (feed->entries)
smartfeed.entry
smartfeed.feed
smartfeed.finalize
publish.init
for feed (update->feeds)
for entry (feed->entries)
publish.entry.fixup
publish.feed
for entry (feed->entries)
publish.entry
publish.finalize
plugin.finalize
0.5.5 と違う部分を太字にしました。一番大きく違うのが,subscription / aggregator の TYPE がなくなり仕組みも変わっているところです。
たとえば,CustomFeed::PerlMonk は Subscription plugin としては働かず Aggregator として働くのですが,customfeed.handle ハンドラにおいて feed の URL がターゲットのものであるかどうかで aggregate するかどうかを判断しています。
一方,CustomFeed::Mixi は Subscription plugin として生涯が始まるのですが,$context->subscription に feed を追加する際,feed(Plagger::Feed)の aggregate プロパティにアグリゲートハンドラを登録します。このようにすることで,そのフィードは CustomFeed::Mixi のもっているアグリゲートハンドラでのみ処理することになります。
なんか説明があまりうまくなくてすみません。
あと,設定ファイルのなかに Aggregator::* が指定されていない場合に,Bundle::Defaults によって Aggregator::Simple が自動的に読み込まれるところにはまりました。
