Hi Jochen,
You are right, there is no need to use rehydrate in this example. Keeping track
of the owner and delegate in this nested hierarchy would complicate my code and
so I will just use a plain delegate as follows which lets me access the binding
in DSL_NOT_OK:
Foo dslEntryPoint(@DelegatesTo(Foo) closure) {
Foo foo = new Foo()
closure.delegate = foo
closure.call()
foo
}
Thanks,
Michael
> On 26 Sep 2016, at 10:30, Jochen Theodorou <[email protected]> wrote:
>
>
>
> On 26.09.2016 09:02, Michael Rüegg wrote:
>> Hi,
>>
>> I have a Groovy based DSL in which I want to access variables from declared
>> bindings. Here's my DSL implementation:
>>
>> https://gist.github.com/MichaelRueegg/f3f09aeb5853bdb58ca017eb1d4d7a30
>>
>> As you can see, when I bind the variable magicValue with def (DSL_OK), I can
>> access its value in my DSL, whereas otherwise (DSL_NOT_OK) I get a
>>
>> java.lang.NullPointerException: Cannot get property 'magicValue' on null
>> object
>
> in the first case you are accessing a local variable, which is done without
> bothering with owner and delegate of the Closure instance. In the second case
> you are going through these to find the meaning of the magicValue. But since
> you use rehydrate to set owner and delegate to null, you will end up in an
> error. Why do you do rehydrate at all? Maybe in your bigger code there is a
> need for this I won't see here, but in what I see I obviously fail to see the
> need. If you have to use it, then of course you will have to set owner and/or
> delegate, or else you won't be able to sue the standard mechanisms to access
> the binding from the Closure instance
>
> bye Jochen