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 が自動的に読み込まれるところにはまりました。