単純な Groovy DSL を考えてみましょう
execute {
sendNotification owner
sendNotification payee
}
実行の実装は
public static void execute(Closure dslCode) {
Closure clonedCode = dslCode.clone()
def dslDelegate = new MyDslDelegate(owner: 'IncCorp', payee: 'TheBoss')
clonedCode.delegate = dslDelegate
clonedCode.call()
}
カスタムデリゲートは
public static class MyDslDelegate {
def owner
def payee
void sendNotification(to) {
println "Notification sent to $to"
}
}
execute
実行中のブロックの期待される結果は
Notification sent to IncCorp
Notification sent to TheBoss
実際のものは
Notification sent to class package.OwnerClassName
Notification sent to TheBoss
問題は、Groovy自体owner
の予約済みプロパティであり、 Groovy の実装により、値をデリゲートからのカスタム値に置き換えるのに役立つオプションがないことです。Closure
resolveStrategy
owner
getProperty
Closure
public Object getProperty(final String property) {
if ("delegate".equals(property)) {
return getDelegate();
} else if ("owner".equals(property)) {
return getOwner();
...
} else {
switch(resolveStrategy) {
case DELEGATE_FIRST:
...
}
私の質問は、この制限をどのようowner
に達成し、カスタム DSL でプロパティ名を使用できるかということです。