view 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 source

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);
	}
}