Details
-
Type:
Improvement
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: None
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
-
Testcase included:yes
-
Number of attachments :
Description
When static missing properties are catched, the handler is called also when an inherited static method is called.
It is not a serious problem, but it feels weird. Either it should be changed (if possible with reasonably small effort), or thoroughly documented.
Also, it should be documented that if the handler throws a MissingPropertyException, it gets silently eaten up and the static method is called all right. On the other hand, any other exception goes all the way up to the user-level harness if any, which is generally rather undesirable.
Here's a code sample which illustrates the problem, along with the proper exception thrown so as the method is properly called:
===
class Foo {
static def inheritedStaticMethod()
}
class Test extends Foo {
static def main(av) {
// need to catch all class-level missing properties
Object.metaClass.static.propertyMissing={
println "Property $it of $
// simulated 'found valid dynamic property' case
if (it.startsWith('f')) return "(${delegate.simpleName}
.$it OK)"
// oops, we did not find valid d.p, so we
throw new MissingPropertyException("No valid DP for $
.$it")
}
println "Checking the handler: $
$
{Foo.foo}$
{Test.foo}$
{String.foo}"
inheritedStaticMethod()
}
}
===
Oh, I did not notice – there remains one problem, for which I don't see an easy work-around.
If it is possible that there are both a property and a static class method of the same name, they are, far as I can see, undistinguishable in the propertyMissing handler.
Suppose the class Foo of the example should also have a dynamic property named "inheritedStaticMethod". Far as I can say, for a class is having both a static method and property of the same name completely legal and valid case.
It will fail with potentially disastrous consequences, for the propertyMissing code would find the dynamic property at wrong moment (when it was not accessed in fact). If the dynamic property access happens to have any side-effects (even as innocent as filling caches), all hell may break loose.
Seems I cannot edit the issue, but perhaps someone who can might bump it up to priority "Major", unless an easy work-around for this problem exists and I am just overlooking it? Thanks.