diff core/src/luan/LuanState.java @ 195:24ede40ee0aa

make MetatableGetter DeepCloneable, scoped, and secure git-svn-id: https://luan-java.googlecode.com/svn/trunk@196 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 03 Jul 2014 08:19:48 +0000
parents cf939124461a
children 8960c81eb4bc
line wrap: on
line diff
--- a/core/src/luan/LuanState.java	Wed Jul 02 04:52:25 2014 +0000
+++ b/core/src/luan/LuanState.java	Thu Jul 03 08:19:48 2014 +0000
@@ -57,7 +57,6 @@
 	private LuanTable preload;
 	private LuanTable searchers;
 
-	private final List<MetatableGetter> mtGetters;
 	final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>();
 
 	protected LuanState() {
@@ -66,11 +65,6 @@
 		loaded = new LuanTable();
 		preload = new LuanTable();
 		searchers = new LuanTable();
-		mtGetters = new ArrayList<MetatableGetter>();
-	}
-
-	protected LuanState(LuanState luan) {
-		mtGetters = new ArrayList<MetatableGetter>(luan.mtGetters);
 	}
 
 	@Override public void deepenClone(LuanState clone,DeepCloner cloner) {
@@ -146,21 +140,12 @@
 	}
 
 	public final LuanTable getMetatable(Object obj) {
-		if( obj instanceof LuanTable ) {
-			LuanTable table = (LuanTable)obj;
-			return table.getMetatable();
-		}
-		for( MetatableGetter mg : mtGetters ) {
-			LuanTable table = mg.getMetatable(obj);
-			if( table != null )
-				return table;
-		}
-		return null;
+		return getMetatable(obj,null);
 	}
 
-	public final void addMetatableGetter(MetatableGetter mg) {
-		mtGetters.add(mg);
-	}
+	public abstract LuanTable getMetatable(Object obj,MetatableGetter beforeThis);
+
+	public abstract void addMetatableGetter(MetatableGetter mg);
 
 	public final LuanBit bit(LuanElement el) {
 		return new LuanBit(this,el);