code: public PreparedStatement getPreparedStatement(Q query, boolean useCaching) {
  
  		PreparedStatement pStatement = null;
  
  		if (useCaching) {
  			pStatement = cachedStatement.get();
  		}
  
  		if (pStatement == null) {
  			try {
  				RegularStatement stmt = getQueryGen(query).call();
  				if (LOG.isDebugEnabled()) {
  					LOG.debug("Query: " + stmt.getQueryString());
  				}
  				pStatement = sessionRef.get().prepare(stmt.getQueryString());
  			} catch (Exception e) {
  				throw new RuntimeException(e);
  			}
  		}
  
  		if (useCaching && cachedStatement.get() == null) {
  			cachedStatement.set(pStatement);
  		}
  		return pStatement;
  	}
docs: Get the bound statemnent by either constructing the query or using the cached statement underneath.
  Note that the caller can provide useCaching as a knob to turn caching ON/OFF.
  If false, then the query is just constructed using the extending class and returned.
  If true, then the cached reference is consulted. If the cache is empty, then the query is constructed
  and used to seed the cache.
  
  @param query
  @param useCaching
  @return PreparedStatement