mikutterの最新の情報は、mikutter blogに引っ越しました。

2011年9月30日金曜日

プラグインの新しい定義方法

前にプラグインを定義する方法を書いたんだけど、なかなか見た目が酷いものだったのでなんとかしようと思って、最近はもうちょっと情況が良くなってる。

例えば最近話題になってないDirectMessageのプラグインは、新しい書き方が使われてる。

今までは、Plugin.createで作ったプラグインオブジェクトにadd_eventメソッドとかで新しいイベントを定義してました。このせいで、mikutterのプラグインはかっこ悪いことになってました。

新しい形式では、Plugin.createがブロックを取れるようになっていて、プラグインオブジェクトのスコープでinstance_evalするようになりました。更にmethod_missingでイベントのフックがかけるので前回のプラグイン定義の記事のコードが

Module.new do
  plugin = Plugin.create(:myplugin)
  plugin.add_event(:update){ |service, messages|
    messages.each{ |m|
      puts m.to_s
    }
  }
  plugin.add_event(:mention){ |service, messages|
    messages.each{ |m|
      puts m.to_s
    }
  }
end

こうなります

Plugin.create(:myplugin) do
  onupdate do |service, messages|
    messages.each{ |m|
      puts m.to_s
    }
  end

  onmention do |service, messages|
    messages.each{ |m|
      puts m.to_s
    }
  end
end

当社比よくなった、これは人類にとっては小さな(ry

なにがよくなったかまとめると

  • いちいちPluginを変数に入れなくていい
  • Plugin.createがブロックを取るようになったので、外のスコープを汚さないための無名モジュールが消えた
  • イベントを定義するところが簡潔になった

とかかな。

どうなっているかというと、このコミットがされた時のdiffを見れば一目瞭然なんですけど、onかon_で始まるメソッドが呼ばれたら、その後ろをイベント名として、イベントを登録するようになってます。

on_が別に扱われてる理由は、long_name_eventみたいな名前のイベントを呼ぶとき、onlong_name_eventよりon_long_name_eventと書けたほうがバランスがいいからです。
同様に、filter_?でイベントフィルタ、hook_?でフックを登録できるようになっています。

やってること自体はRubyでは別に何ら特殊なことでもないし、こういう感じのもよく見かけますよね。漸く人並みになれました。

これは、0.0.4から使えます。万が一こうやって書かれたプラグインを0.0.3にインストールすると、何も起こりません。注意してください。


今後は、こういうノリで動作する必要なmikutterのバージョンとか、プラグインの情報(作者、連絡先、最新版の入手方法、反省文)とかも書けるようにしたらいいと思った。
(だけどこういう情報って外部のテキストファイルに持っておけばロードする前に確認できていいのかな うーん難しいところだ)

さらにですね。近いうちにプラグインを取り外すことができるようにします。具体的に言うと、今も既にプラグインの動作を停止できるけど、その時にコールバックが呼ばれるようにして、後処理ができるようにします。
これで、管理画面からプラグインを気軽に外したり、新しく入れたりできるようになるでしょう。

まとめ

新しいプラグインの定義方法について書きました。このあたりが便利になるといいね