Hi all.
It’s Friday, so I thought I’d try to do something crazy.
We have a split interface/implementation type of API in use, something
like this:
// In public documentation
package acme;
interface Item {
List<Item> getChildren();
}
// Somewhere the user doesn't have access to, or at least where
the names might change every build.
package com.acme.script.private;
class DefaultItem implements Item {
// … black box …
}
I thought, wouldn’t it be nice if I could graft additional methods
onto this interface, so that anything implementing that interface
would get them for free when used from that script. So I did this:
include_class 'acme.Item'
class Item
def descendants
children.map { |child| [ child ] + child.descendants }
end
end
item = # get an item
item.descendants
And this gives me an error, which is not all that surprising:
<script>:14: Item is not a class (TypeError)
org.jruby.embed.EvalFailedException: Item is not a class
at
org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:127)
at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Not surprisingly, if I use the class itself, then it works… but I
guess I was wondering, is there any way to achieve this sort of thing
in a nice way when all the user has access to is the interface?
TX
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email