code: private Later<JsonNode> createFetcher() {
  		final RequestBuilder call = new GraphRequestBuilder(getGraphEndpoint(), HttpMethod.POST, this.timeout, this.retries);
  		
  		// This actually creates the correct JSON structure as an array
  		String batchValue = JSONUtils.toJSON(this.graphRequests, this.mapper);
  		if (log.isLoggable(Level.FINEST))
  			log.finest("Batch request is: " + batchValue);
  
  		this.addParams(call, new Param[] { new Param("batch", batchValue) });
  		
  		final HttpResponse response;
  		try {
  			response = call.execute();
  		} catch (IOException ex) {
  			throw new IOFacebookException(ex);
  		}
  		
  		return new Later<JsonNode>() {
  			@Override
  			public JsonNode get() throws FacebookException
  			{
  				try {
  					if (response.getResponseCode() == HttpURLConnection.HTTP_OK
  							|| response.getResponseCode() == HttpURLConnection.HTTP_BAD_REQUEST
  							|| response.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
  						
  						// If it was an error, we will recognize it in the content later.
  						// It's possible we should capture all 4XX codes here.
  						JsonNode result = mapper.readTree(response.getContentStream());
  						
  						if (log.isLoggable(Level.FINEST))
  							log.finest("Response is: " + result);
  						
  						return result;
  					} else {
  						throw new IOFacebookException(
  								"Unrecognized error " + response.getResponseCode() + " from "
  								+ call + " :: " + StringUtils.read(response.getContentStream()));
  					}
  				} catch (IOException e) {
  					throw new IOFacebookException("Error calling " + call, e);
  				}
  			}
  		};
  	}
docs: Constructs the batch query and executes it, possibly asynchronously.
  @return an asynchronous handle to the raw batch result, whatever it may be.