view 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 source

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();
			}
		};
	}

}