For a simple case, you better use a card.
If you really want to evaluate it as a closure (perhaps to create your own DSL), you will need to change your syntax a bit, as John points out. Here is one way to do this, using the Builder class to evaluate the “something” closure within what is passed to the builder.
groovy / :
class SomethingBuilder {
Map valueMap = [:]
SomethingBuilder(object) {
def callable = object.something
callable.delegate = this
callable.resolveStrategy = Closure.DELEGATE_FIRST
callable()
}
def propertyMissing(String name) {
return valueMap[name]
}
def propertyMissing(String name, value) {
valueMap[name] = value
}
def methodMissing(String name, args) {
if (args.size() == 1) {
valueMap[name] = args[0]
} else {
valueMap[name] = args
}
}
}
class Person {
static something = {
key1 "value1"
key2("value2")
key3 = "value3"
key4 "foo", "bar", "baz"
}
}
def builder = new SomethingBuilder(new Person())
assert "value1" == builder."key1"
assert "value2" == builder."key2"
assert "value3" == builder."key3"
assert ["foo", "bar", "baz"] == builder."key4"