例えば最近話題になってない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にインストールすると、何も起こりません。注意してください。