ruby で DSL
- http://www.infoq.com/jp/articles/properties-metaprogramming
> InfoQ: メタプログラミングを使ってRubyにプロパティを追加する
この記事では、最終的なコードは示されていないが、
次の記事では、(最終的な実装 + アルファ機能) のコード例が示されている。
- http://electricsheep.blogspot.com/2007/04/metaprogramming-and-dsl-resources.html
> dreaming of electric sheep: Metaprogramming and DSL Resources?
property の設定変更のリスナー設定だけでなく、設定できる値の範囲設定をしている。素晴らしい!
ruby, ruby1.9, jruby いずれでも動作する。
property foo に対して add_foo_listener() をよび出さなかった場合に
実行時にエラーが発生したので、次のように修正をした。
def fire_event_for(sym, arg)
@listener ||= { } // 追加
@listener[sym] ||= [] // 追加
@listener[sym].each { |l| l.call(arg) }
end
もっとよい修正法がある気もするが。
(追加したコードが definemethod("add_#{sym_listener)
にあるものと重複してしまっているので...)
http://svn.sourceforge.jp/view/trunk/Edinet/tools/dsl/?root=ruby-xbrl
に 変更を加えたソースコードを commit してある。
最近のコメント