diff core/src/luan/impl/MtGetterLink.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
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/src/luan/impl/MtGetterLink.java	Thu Jul 03 08:19:48 2014 +0000
@@ -0,0 +1,44 @@
+package luan.impl;
+
+import luan.MetatableGetter;
+import luan.LuanTable;
+import luan.DeepCloneable;
+import luan.DeepCloner;
+
+
+final class MtGetterLink implements DeepCloneable<MtGetterLink> {
+	private MetatableGetter mg;
+	private MtGetterLink next;
+
+	private MtGetterLink() {}
+
+	MtGetterLink(MetatableGetter mg,MtGetterLink next) {
+		this.mg = mg;
+		this.next = next;
+	}
+
+	LuanTable getMetatable(Object obj,MetatableGetter beforeThis) {
+		if( beforeThis != null ) {
+			if( beforeThis==mg )
+				beforeThis = null;
+		} else {
+			LuanTable mt = mg.getMetatable(obj);
+			if( mt != null )
+				return mt;
+		}
+		return next==null ? null : next.getMetatable(obj,beforeThis);
+	}
+
+	boolean contains(MetatableGetter mg) {
+		return this.mg==mg || next!=null && next.contains(mg);
+	}
+
+	@Override public MtGetterLink shallowClone() {
+		return new MtGetterLink();
+	}
+
+	@Override public void deepenClone(MtGetterLink clone,DeepCloner cloner) {
+		clone.mg = cloner.deepClone(mg);
+		clone.next = cloner.deepClone(next);
+	}
+}