Я пишу небольшой Groovy DSL
, чтобы позволить конечным пользователям определять файлы конфигурации. Идея состоит в том, что я загружаю эти файлы в среду Java, устанавливаю некоторые значения и выполняю их. Вот небольшой пример из DSL до сих пор (стиль Gradle-ish специально):
model {
file "some/path/here"
conformsTo "some/other/path/here"
}
model {
...
}
Если я сохраню приведенный выше код в файл (example.groovy), я смогу интегрировать его с Java через GroovyShell
:
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate(...);
Сложная часть - это установка "корневого" объекта. Я знаю, что могу использовать Bindings для установки и вывода переменных. Однако я хочу, чтобы блоки «модели» в DSL были сопоставлены с вызовом метода, т. Е. Я хочу указать эквивалент «этого» для всего скрипта. Все, что я пишу в DSL, должно быть в рамках этого «корневого» объекта, например.
// model is a method of the root object
model {
file "some/path/here"
conformsTo someValue // if someValue is not defined inside the script, I want it to be considered as a property of the root object
}
Я нашел эту превосходную статью о том, чего я хочу достичь, но поскольку это с 2008 года, я подумал, что в новых версиях Groovy могут быть лучшие варианты. Я просто не знаю, что искать. Может кто-то указать мне верное направление?