public static final Object METHOD = new Object() { public String toString() { return "JS.METHOD"; } };
public final JS unclone() { return _unclone(); }
+ public final JS jsclone() throws JSExn { return new Clone(this); }
public Enumeration keys() throws JSExn { return entries == null ? emptyEnumeration : entries.keys(); }
public Object get(Object key) throws JSExn { return entries == null ? null : entries.get(key, null); }
public void put(Object key, Object val) throws JSExn { (entries==null?entries=new Hash():entries).put(key,null,val); }
}
JS _unclone() { return this; }
- public static class Cloneable extends JS {
- public Object jsclone() throws JSExn {
- return new Clone(this);
- }
- }
-
- public static class Clone extends JS.Cloneable {
- protected JS.Cloneable clonee = null;
+
+ public interface Cloneable { }
+
+ public static class Clone extends JS implements Cloneable {
+ protected JS clonee;
JS _unclone() { return clonee.unclone(); }
- public JS.Cloneable getClonee() { return clonee; }
- public Clone(JS.Cloneable clonee) { this.clonee = clonee; }
+ public JS getClonee() { return clonee; }
+ public Clone(JS clonee) throws JSExn {
+ if(!(clonee instanceof Cloneable)) throw new JSExn("this object isn't cloneable");
+ this.clonee = clonee;
+ }
public boolean equals(Object o) {
if (!(o instanceof JS)) return false;
return unclone() == ((JS)o).unclone();