view core/src/luan/LuanPropertyMeta.java @ 407:7fd9f1b7b878

replace LuanPropertyTable with LuanPropertyMeta
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 13:01:00 -0600
parents
children 1b38de2b1845
line wrap: on
line source

package luan;


public 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 LuanTableImpl();
		meta.setters = new LuanTableImpl();
		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 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;
	}

}