docs: @SuppressWarnings("unchecked")
  	public <T> T exec(final Callback<T> callback) throws Exception {
  		// Build request URL from remote class implementation URL and remote method name then delegate connection factory to
  		// actually open the connection. Connection is stored into {@link #connection}.
  
  		StringBuilder requestURL = new StringBuilder(implementationURL);
  		if (!implementationURL.endsWith("/")) {
  			requestURL.append("/");
  		}
  		requestURL.append(methodPath);
  		connection = connectionFactory.openConnection(new URL(requestURL.toString()));
  
  		// if no callback provided execute transaction synchronously
  		if (callback == null) {
  			return (T) exec();
  		}
  
  		AsyncTask<T> task = new AsyncTask<T>(callback) {
  			@Override
  			protected T execute() throws Throwable {
  				return (T) HttpRmiTransaction.this.exec();
  			}
  
  			@Override
  			protected void onThrowable(Throwable throwable) {
  				super.onThrowable(throwable);
  				if (HttpRmiTransaction.this.exceptionHandler != null) {
  					HttpRmiTransaction.this.exceptionHandler.handle(throwable);
  				}
  			}
  		};
  		task.start();
  		return null;
  	}