This is what I meant by *extensibility*. Making it final private you cancel the last chance to change behavior for other people. Now I'm having in my code this dirty hack:

    def yoke = new GYoke(vertx, container)

    GYokeRequest.metaClass.createSession = { String sessionId ->
        final JsonObject session = new JsonObject().putString("id", sessionId);

        delegate.put("session", session);

        delegate.response().headersHandler(H.throObject {
            JsonObject s = delegate.get("session");
            if (session != null) {
                yoke.toJavaYoke().store.set(sessionId, session, H.throObject { error ->
                    if (error != null) {
                        // TODO: better handling of errors
                        System.err.println(error);
                    }
                })
            }
        })

        session;
    }

In the example I have to call external service to get internal variable when I want to change class behavior because I have no access to object internals. 

Making things private is obsolete nowadays, even groovy's concept is about making everything public ;) I use to participate in big enterprise java product ready for customization on any level we use *protected* methods/variables in 90% of cases though. So far no one complained during customization/integration development ;)