view core/src/luan/LuanPropertyMeta.java @ 413:8937263f59f6

add __pairs; add back HttpServicer.get_parameter_values;
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 19:01:18 -0600
parents 1b38de2b1845
children ce8e19567911
line wrap: on
line source

package luan;

import java.util.Map;
import java.util.Iterator;


public final class LuanPropertyMeta extends LuanMeta implements DeepCloneable<LuanPropertyMeta> {
	private LuanTable getters;
	private LuanTable setters;

	private LuanPropertyMeta() {}

	public static LuanPropertyMeta newInstance() {
		LuanPropertyMeta meta = new LuanPropertyMeta();
		meta.getters = new LuanTable();
		meta.setters = new LuanTable();
		return meta;
	}

	public LuanTable getters() {
		return getters;
	}

	public LuanTable setters() {
		return setters;
	}

	@Override public LuanPropertyMeta shallowClone() {
		return new LuanPropertyMeta();
	}

	@Override public void deepenClone(LuanPropertyMeta clone,DeepCloner cloner) {
		clone.getters = cloner.get(getters);
		clone.setters = cloner.get(setters);
	}

	@Override public Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException {
		Object obj = getters.get(key);
		if( obj == null )
			return null;
		if( !(obj instanceof LuanFunction) )
			throw luan.exception("get for '"+key+"' isn't a function");
		LuanFunction fn = (LuanFunction)obj;
		return luan.call(fn);
	}

	@Override protected Iterator keys() {
		return new Iterator() {
			final Iterator<Map.Entry<Object,Object>> iter = getters.iterator();

			@Override public boolean hasNext() {
				return iter.hasNext();
			}
			@Override public Object next() {
				return iter.next().getKey();
			}
			@Override public void remove() {
				throw new UnsupportedOperationException();
			}
		};
	}


	@Override public boolean canNewindex() {
		return true;
	}

	@Override public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
		Object obj = setters.get(key);
		if( obj == null )
			throw luan.exception("can't set property '"+key+"'");
		if( !(obj instanceof LuanFunction) )
			throw luan.exception("set for '"+key+"' isn't a function");
		LuanFunction fn = (LuanFunction)obj;
		luan.call(fn,new Object[]{value});
	}

	@Override public LuanTable newMetatable() {
		LuanTable mt = super.newMetatable();
		mt.put( "get", getters );
		mt.put( "set", setters );
		return mt;
	}

}