package sample.duplicate;

import javassist.tools.reflect.*;

public class DuplicatedObject extends Metaobject {
    private DuplicatedObject backup;

    // if a base-level object is created, this metaobject creates
    // a copy of the base-level object.

    public DuplicatedObject(Object self, Object[] args) {
	super(self, args);
	ClassMetaobject clazz = getClassMetaobject();
	if (clazz.isInstance(args[0]))
	    backup = null;	// self is a backup object.
	else {
	    Object[] args2 = new Object[1];
	    args2[0] = self;
	    try {
		Metalevel m = (Metalevel)clazz.newInstance(args2);
		backup = (DuplicatedObject)m._getMetaobject();
	    }
	    catch (CannotCreateException e) {
		backup = null;
	    }
	}
    }

    public Object trapMethodcall(int identifier, Object[] args) 
	throws Throwable
    {
	Object obj = super.trapMethodcall(identifier, args);
	if (backup != null)
	    backup.trapMethodcall(identifier, args);

	return obj;
    }
}