次のような構文でDSLを作成したいと思います。
Graph.make {
foo {
bar()
definedMethod1() // isn't missing!
}
baz()
}
このツリーのハンドラーが最も外側のクロージャーに遭遇すると、いくつかのクラスのインスタンスが作成されます。このクラスには、いくつかの定義済みメソッドと、欠落しているメソッド用の独自のハンドラーがあります。
これは、次のような構造で十分簡単だと思いました。
public class Graph {
def static make(Closure c){
Graph g = new Graph()
c.delegate = g
c()
}
def methodMissing(String name, args){
println "outer " + name
ObjImpl obj = new ObjImpl(type: name)
if(args.length > 0 && args[0] instanceof Closure){
Closure closure = args[0]
closure.delegate = obj
closure()
}
}
class ObjImpl {
String type
def methodMissing(String name, args){
println "inner " + name
}
def definedMethod1(){
println "exec'd known method"
}
}
}
ただし、methodMissingハンドラーは、内部クロージャーをObjImplに委任するのではなく、Graph内のクロージャー全体を解釈し、次の出力を生成します。
outer foo
outer bar
exec'd known method
outer baz
内部クロージャの欠落しているメソッド呼び出しを、作成した内部オブジェクトにスコープするにはどうすればよいですか?