view core/src/luan/LuanMeta.java @ 405:3e68917a0dc6

add LuanMeta
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 11:10:11 -0600
parents
children 1b38de2b1845
line wrap: on
line source

package luan;

import java.util.Map;


public abstract class LuanMeta /*implements Iterable<Map.Entry<Object,Object>>*/ {

	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;

//	public abstract LuanFunction __pairs(LuanState luan,LuanTable tbl) throws LuanException;

	public boolean canNewindex() {
		return false;
	}

	public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
		throw new UnsupportedOperationException();
	}

	public LuanTable newMetatable() {
		LuanTable mt = new LuanTableImpl();
/*
		try {
			mt.put( "__index", new LuanJavaFunction(
				LuanMeta.class.getMethod( "__index", LuanState.class, LuanTable.class, Object.class ), this
			) );
			if( canNewindex() ) {
				mt.put( "__newindex", new LuanJavaFunction(
					LuanMeta.class.getMethod( "__newindex", LuanState.class, LuanTable.class, Object.class, Object.class ), mt
				) );
			}
		} catch(NoSuchMethodException e) {
			throw new RuntimeException(e);
		}
*/
		mt.put( "__index", this );
//		mt.put( "__pairs", this );
		if( canNewindex() )
			mt.put( "__newindex", this );
		return mt;
	}

	public LuanTable newTable() {
		LuanTable tbl = new LuanTableImpl();
		tbl.setMetatable( newMetatable() );
		return tbl;
	}
}