/** Provisions a new T. */
  private T provision(
      Errors errors, InternalContext context, ConstructionContext<T> constructionContext)
      throws ErrorsException {
    try {
      T t;
      try {
        Object[] parameters = SingleParameterInjector.getAll(errors, context, parameterInjectors);
        t = constructionProxy.newInstance(parameters);
        constructionContext.setProxyDelegates(t);
      } finally {
        constructionContext.finishConstruction();
      }

      // Store reference. If an injector re-enters this factory, they'll get the same reference.
      constructionContext.setCurrentReference(t);

      MembersInjectorImpl<T> localMembersInjector = membersInjector;
      localMembersInjector.injectMembers(t, errors, context, false);
      localMembersInjector.notifyListeners(t, errors);

      return t;
    } catch (InvocationTargetException userException) {
      Throwable cause = userException.getCause() != null ? userException.getCause() : userException;
      throw errors
          .withSource(constructionProxy.getInjectionPoint())
          .errorInjectingConstructor(cause)
          .toException();
    } finally {
      constructionContext.removeCurrentReference();
    }
  }