+ /** provides redirection of a specified key */
+ public static class Graft extends Res {
+ Res graftee;
+ Object replaced_key, replaced_val;
+ Graft(Res graftee, Object key, Object val) { this.graftee = graftee; this.replaced_key = key; this.replaced_val = val; }
+ public boolean equals(Object o) { return this == o || graftee.equals(o); }
+ public int hashCode() { return graftee.hashCode(); }
+ public InputStream getInputStream(String s) throws IOException { return graftee.getInputStream(s); }
+ public Object get(Object key) throws JSExn { return replaced_key.equals(key) ? replaced_val : graftee.get(key); }
+ public Object callMethod(Object name, Object a, Object b, Object c, Object[] rest, int nargs) throws JSExn {
+ if (replaced_key.equals(name)) {
+ if (replaced_val instanceof JS) return ((JS)replaced_val).call(a, b, c, rest, nargs);
+ else throw new JSExn("attempted to call non-function (class="+replaced_val.getClass()+")");
+ } else {
+ return graftee.callMethod(name, a, b, c, rest, nargs);
+ }
+ }
+ public Number coerceToNumber() { return graftee.coerceToNumber(); }
+ public String coerceToString() { return graftee.coerceToString(); }
+ public boolean coerceToBoolean() { return graftee.coerceToBoolean(); }
+ public String typeName() { return graftee.typeName(); }
+ }
+