clone<X extends E> method
Produces a clone of this object.
Implementation
X clone<X extends E>([C? cloner]) {
final newInstance = _doWhenCreateInstance(self) ?? createInstance();
if (newInstance is! IsClonable<T, E, C>) {
throw StateError('Invalid newInstance returned, expected ${IsClonable<T, E, C>}!');
}
_assignClone(newInstance);
_doCheckIsCloneFresh(newInstance);
if (newInstance.isCloned) {
return (_doWhenCloned(self, newInstance) ?? newInstance) as X;
}
final readyToClone = _doWhenClone(self, cloner) ?? createClone(newInstance, cloner);
if (readyToClone is! IsClonable<T, E, C>) {
throw StateError('Invalid readyToClone returned, expected ${IsClonable<T, E, C>}!');
}
_doCheckIsCloneFresh(readyToClone);
if (readyToClone.isCloned) {
return (_doWhenCloned(self, readyToClone) ?? readyToClone) as X;
}
final fullyCloned = cloneInto(readyToClone, cloner);
return (_doWhenCloned(self, fullyCloned) ?? fullyCloned) as X;
}