我想创建一个语法如下的 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 处理程序解释了 Graph 内部的整个闭包,而不是将内部闭包委托给 ObjImpl,从而产生输出:
outer foo
outer bar
exec'd known method
outer baz
如何将内部闭包的缺失方法调用限定为我创建的内部对象?