docs: @Override
  	public Object invoke(final MethodInvocation invocation) throws Throwable {
  
  		if (this.logger.isDebugEnabled()) {
  			this.logger.debug("Executing proxied method in stateful retry: "
  					+ invocation.getStaticPart() + "("
  					+ ObjectUtils.getIdentityHexString(invocation) + ")");
  		}
  
  		Object[] args = invocation.getArguments();
  		Object defaultKey = Arrays.asList(args);
  		if (args.length == 1) {
  			defaultKey = args[0];
  		}
  
  		Object key = createKey(invocation, defaultKey);
  		RetryState retryState = new DefaultRetryState(key,
  				this.newMethodArgumentsIdentifier != null
  						&& this.newMethodArgumentsIdentifier.isNew(args),
  				this.rollbackClassifier);
  
  		Object result = this.retryOperations
  				.execute(new StatefulMethodInvocationRetryCallback(invocation, label),
  						this.recoverer != null
  								? new ItemRecovererCallback(args, this.recoverer) : null,
  						retryState);
  
  		if (this.logger.isDebugEnabled()) {
  			this.logger.debug("Exiting proxied method in stateful retry with result: ("
  					+ result + ")");
  		}
  
  		return result;
  
  	}