Mercurial Hosting > luan
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; } }