forse mettere tutto quel codice non è stata una buona idea, il mio problema era semplicemente questo:
se passo un oggetto per riferimento ad una funzione che a sua volta lo vuole ripassare per riferimento ad un'altra funzione, come faccio a fare in modo che l'ultima istanza sia la stessa della prima... cioè:

$element = new Element();

func1($element);

func1(&$element)
{
//$element è lo stesso, è un riferimento

func2($element);
}

func2(&$element)
{
//$element non è più lo stesso, ma una copia
}