diff core/src/luan/LuanPropertyTable.java @ 226:392105b660d7

add LuanProperty git-svn-id: https://luan-java.googlecode.com/svn/trunk@227 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 22 Jul 2014 06:23:13 +0000
parents
children 1bce334a816b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/src/luan/LuanPropertyTable.java	Tue Jul 22 06:23:13 2014 +0000
@@ -0,0 +1,58 @@
+package luan;
+
+import java.util.Set;
+import java.util.Map;
+import java.util.AbstractMap;
+import java.util.Iterator;
+
+
+class LuanPropertyTable extends LuanTableImpl {
+
+	@Override public LuanTableImpl shallowClone() {
+		return new LuanPropertyTable();
+	}
+
+	private Object fixValue(Object obj) {
+		return obj instanceof LuanProperty ? ((LuanProperty)obj).get() : obj;
+	}
+
+	@Override String repr(Set<LuanTableImpl> set,Object obj) {
+		return super.repr(set,fixValue(obj));
+	}
+
+	@Override public Object get(Object key) {
+		return fixValue(super.get(key));
+	}
+
+	@Override public void put(Object key,Object val) {
+		Object v = super.get(key);
+		if( v instanceof LuanProperty ) {
+			LuanProperty lp = (LuanProperty)v;
+			if( lp.set(val) )
+				return;
+		}
+		super.put(key,val);
+	}
+
+	@Override public Iterator<Map.Entry<Object,Object>> iterator() {
+		final Iterator<Map.Entry<Object,Object>> i = super.iterator();
+		return new Iterator<Map.Entry<Object,Object>>() {
+			public boolean hasNext() {
+				return i.hasNext();
+			}
+			public Map.Entry<Object,Object> next() {
+				Map.Entry<Object,Object> entry = i.next();
+				Object v = entry.getValue();
+				if( v instanceof LuanProperty ) {
+					LuanProperty lp = (LuanProperty)v;
+					return new AbstractMap.SimpleEntry<Object,Object>(entry.getKey(),lp.get());
+				}
+				return entry;
+			}
+			public void remove() {
+				i.remove();
+			}
+		};
+	}
+
+}