diff src/luan/LuanFunction.java @ 1335:e0cf0d108a77

major cleanup
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 14 Feb 2019 03:10:45 -0700
parents 25746915a241
children e1a13e707bf3
line wrap: on
line diff
--- a/src/luan/LuanFunction.java	Tue Feb 12 22:53:57 2019 -0700
+++ b/src/luan/LuanFunction.java	Thu Feb 14 03:10:45 2019 -0700
@@ -1,16 +1,72 @@
 package luan;
 
 
-public abstract class LuanFunction {
+public abstract class LuanFunction implements LuanCloneable, Cloneable {
+	private Luan luan;
+	private LuanCloner cloner;
+	private boolean clone;
+
+	public LuanFunction(Luan luan) {
+		if( luan==null )  throw new NullPointerException();
+		this.luan = luan;
+		this.clone = true;
+	}
+
+	public LuanFunction(boolean clone) {
+		this.clone = clone;
+	}
+
+	// for LuanJavaFunction
+	void dontClone() {
+		luan = null;
+		clone = false;
+	}
+
+	@Override public LuanFunction shallowClone() {
+		if( !clone )
+			return this;
+		check();
+		try {
+			return (LuanFunction)clone();
+		} catch(CloneNotSupportedException e) {
+			throw new RuntimeException(e);
+		}
+	}
 
-	public abstract Object call(Luan luan,Object[] args) throws LuanException;
+	private void check() {
+		if( cloner != null ) {
+			completeClone(this,cloner);
+			cloner = null;
+		}
+	}
+
+	@Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
+		if( !clone )
+			return;
+		LuanFunction clone = (LuanFunction)dc;
+		switch( cloner.type ) {
+		case COMPLETE:
+			completeClone(clone,cloner);
+			return;
+		case INCREMENTAL:
+			clone.cloner = cloner;
+			return;
+		}
+	}
+
+	protected void completeClone(LuanFunction clone,LuanCloner cloner) {
+		clone.luan = (Luan)cloner.clone(luan);
+	}
+
+	public Luan luan() {
+		check();
+		return luan;
+	}
+
+	public abstract Object call(Object... args) throws LuanException;
 
 	public static final Object[] NOTHING = new Object[0];
 
-	public final Object call(Luan luan) throws LuanException {
-		return call(luan,NOTHING);
-	}
-
 	@Override public String toString() {
 		return "function: " + Integer.toHexString(hashCode());
 	}