clone<T> static method

T clone<T>(
  1. T instance
)

Implementation

static T clone<T>(T instance) {
  // handle null

  //if (instance == null)
  //  return null;

  // handle enums and literals (String, int, double, bool, DateTime)

  if (instance is Enum || instance is String || instance is int || instance is double || instance is bool || instance is DateTime) {
    return instance;
  }

  // datetime

  if (instance is DateTime) {
    return cloneDateTime(instance) as T;
  }

  // types?

  if (TypeDescriptor.hasType(instance.runtimeType)) {
    var descriptor = TypeDescriptor.forType<T>();

    if (descriptor.isImmutable()) {
      Map<String, dynamic> params = {};

      for (var param in descriptor.constructorParameters)
        params[param.name] = clone(descriptor.get(instance as Object, param.name));

      return descriptor.fromMapConstructor!(params);
    }
    else {
      var result = descriptor.constructor!();

      for (var field in descriptor.getFields()) {
        if (field.factoryConstructor != null) { // TODO: Map, Set...
          var container = field.factoryConstructor!();

          for (var item in field.get(instance)) {
            container.add(clone(item));
          }

          field.set(result, container);
        }
        else field.set(result, clone(field.get(instance)));
      }

      return result;
    }
  }

  // any other class?

  return instance;
}