class Foo {
private final boo;
Foo( boo) { this.boo = boo }
def bar( ) { "original $boo" }
}
class FooCategory {
def static bar( Foo self) { "categorical ${self.boo}" }
}
def f = new Foo( 'hello' )
assert f.
bar ( ) == 'original hello'
use
( FooCategory
) { assert f.
bar ( ) == 'categorical hello' }
class Baz {
def quux( boo) { new Foo( boo) .bar ( ) }
}
use
( FooCategory
) { assert new Baz
( ) .
quux ( 'no' ) == 'original no' } // fails as quux returns 'categorical no' even though Foo.bar is not called in this lexical scope!
Y2xhc3MgRm9vIHsKICAgIHByaXZhdGUgZmluYWwgYm9vOwogICAgCiAgICBGb28oYm9vKSB7IHRoaXMuYm9vID0gYm9vIH0KICAgIGRlZiBiYXIoKSB7ICJvcmlnaW5hbCAkYm9vIiB9Cn0KCmNsYXNzIEZvb0NhdGVnb3J5IHsKICAgIGRlZiBzdGF0aWMgYmFyKEZvbyBzZWxmKSB7ICJjYXRlZ29yaWNhbCAke3NlbGYuYm9vfSIgfQp9CgpkZWYgZiA9IG5ldyBGb28oJ2hlbGxvJykKCmFzc2VydCBmLmJhcigpID09ICdvcmlnaW5hbCBoZWxsbycKCnVzZShGb29DYXRlZ29yeSkgeyBhc3NlcnQgZi5iYXIoKSA9PSAnY2F0ZWdvcmljYWwgaGVsbG8nIH0KCmNsYXNzIEJheiB7CiAgICBkZWYgcXV1eChib28pIHsgbmV3IEZvbyhib28pLmJhcigpIH0KfQoKdXNlKEZvb0NhdGVnb3J5KSB7IGFzc2VydCBuZXcgQmF6KCkucXV1eCgnbm8nKSA9PSAnb3JpZ2luYWwgbm8nIH0gLy8gZmFpbHMgYXMgcXV1eCByZXR1cm5zICdjYXRlZ29yaWNhbCBubycgZXZlbiB0aG91Z2ggRm9vLmJhciBpcyBub3QgY2FsbGVkIGluIHRoaXMgbGV4aWNhbCBzY29wZSE=