Plagger 0.7.15 の中身

食わず嫌いで Plagger を敬遠していたんですが,ついにインストールしました。しかし自分がやりたいことをやるには既存のプラグインだけでは無理そう。で,とりあえず既存のプラグインのコードを読んでいたらどんどんわからなくなってしまいました。

資料をあさっていたら,Shibuya.PlaggersPlaggerの中身 - 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 が自動的に読み込まれるところにはまりました。