/** 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(); } }