@Override
  protected Object nextInstance(Object instance) {
    Class<?> protoclass = (instance instanceof Class) ? (Class<?>) instance : instance.getClass();
    if (classOnly) {
      return protoclass;
    }
    else if (instance instanceof Factory) {
      if (argumentTypes != null) {
        return ((Factory)instance).newInstance(argumentTypes, arguments, callbacks);
      }
      else {
        return ((Factory)instance).newInstance(callbacks);
      }
    }
    else {
      return createUsingReflection(protoclass);
    }
  }
@Override
  protected Object nextInstance(Object instance)