Groovy DSL, передача свойств с DELEGATE_ONLY
У меня есть свой DSL, он выглядит так:
topElement {
first {
name "${nameProperty}"
address "${addressProperty}"
}
second {
something "something"
}
}
Вопрос о свойствах, например ${nameProperty}
,
У меня есть мой основной класс, и я загружаю скрипт следующим образом:
Script dslScript = new GroovyShell().parse(dsl.text)
dslScript.setProperty("nameProperty", "value")
dslScript.setProperty("addressProperty", "addressValue")
ExpandoMetaClass emc = new ExpandoMetaClass(dslScript.class, false)
emc.initialize()
dslScript.metaClass = emc
dslScript.run()
Раньше каждое закрытие, которое у меня было в этом DSL, было DELEGATE_FIRST
и свойства работали. Я изменил все на DELEGATE_ONLY
(хотел избежать ситуации, когда кто-то гнездится firsts
10 раз) и свойства перестали работать (No such property nameProperty for class FirstElementDelegate
).
Я думал, что я просто сделаю closure.setProperty("nameProperty", "value")
, но это не работает. Я старался closure.properties.put(...)
и многое другое, и, кажется, ничего не работает.
Есть ли способ добавить свойства в скрипт, чтобы они работали в каждой части скрипта, независимо от контекста?
Уродливое решение, которое будет работать, но ужасно (просто чтобы проиллюстрировать, что я хочу): dsl.text.replace('${nameProperty}', 'value')