2003/06/16 07:58:57
[org.ibex.core.git] / src / org / xwt / js / ScopeImpl.java
diff --git a/src/org/xwt/js/ScopeImpl.java b/src/org/xwt/js/ScopeImpl.java
new file mode 100644 (file)
index 0000000..10788fd
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL] 
+
+package org.xwt.js; 
+import org.xwt.util.*; 
+import java.io.*;
+import java.util.*;
+
+/** A JavaScript Scope */
+class ScopeImpl extends JS.Obj { 
+    private JS.Scope parentScope;
+    private static Object NULL = new Object();
+    public ScopeImpl(JS.Scope parentScope) { this(parentScope, false); }
+    public ScopeImpl(JS.Scope parentScope, boolean sealed) {
+       super(sealed);
+       if (parentScope == this) throw new Error("can't make a scope its own parent!");
+       this.parentScope = parentScope;
+    }
+    public JS.Scope getParentScope() { return parentScope; }
+    
+    // transparent scopes are not returned by THIS
+    public boolean isTransparent() { return false; }
+    
+    public boolean has(Object key) { return super.get(key) != null; }
+    public Object get(Object key) {
+       if (!has(key)) return parentScope == null ? null : getParentScope().get(key);
+       Object ret = super.get(key); return ret == NULL ? null : ret;
+    }
+    public void put(Object key, Object val) {
+       if (!has(key) && parentScope != null) getParentScope().put(key, val);
+       else super.put(key, val == null ? NULL : val);
+    }
+    public Object[] keys() { throw new Error("you can't enumerate the properties of a Scope"); }
+    public void declare(String s) {
+       if (isTransparent()) getParentScope().declare(s);
+       else super.put(s, NULL);
+    }
+}