Dear community, After switching to Groovy 4, I've observed an expected invocation of the Map get method while resolving a closure delegate context.
Consider the following custom Map object in which both `get` and `invokeMethod` methods are overridden: class Context implements Map<String,Object> { @Delegate private Map<String,Object> target Context(Map<String,Object> target) { this.target = target } @Override Object get(Object name) { if( target.containsKey(name) ) return target.get(name) throw new Exception('Missing key: ' + name) } @Override Object invokeMethod(String name, Object args) { if( name == 'foo' ) return 'OK' else super.invokeMethod(name, args) } } Now, a closure tries to invoke the `foo` method via a context delegate, as shown below: def closure = { it -> foo() } closure.delegate = new Context([:]) closure.setResolveStrategy(Closure.DELEGATE_ONLY) assert closure.call() == 'OK' However, the above snipper fails with the following message: java.lang.Exception: Missing key: foo Why does the closure try to access the `foo` attribute instead of invoking it as a method? This code works as expected with Groovy 3. Thanks, Paolo