clone<X extends E> method

X clone<X extends E>([
  1. Cloner<T>? cloner
])
inherited

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