code: @Override
    public <T> OperationFuture<Boolean> add(String key, int exp, T o,
        Transcoder<T> tc) {
      return asyncStore(StoreType.add, key, exp, o, tc);
    }
docs: Add an object to the cache iff it does not exist already.
  
  <p>
  The {@code exp} value is passed along to memcached exactly as given,
  and will be processed per the memcached protocol specification:
  </p>
  
  <p>
  Note that the return will be false any time a mutation has not occurred.
  </p>
  
  <blockquote>
  <p>
  The actual value sent may either be Unix time (number of seconds since
  January 1, 1970, as a 32-bit value), or a number of seconds starting from
  current time. In the latter case, this number of seconds may not exceed
  60*60*24*30 (number of seconds in 30 days); if the number sent by a client
  is larger than that, the server will consider it to be real Unix time value
  rather than an offset from current time.
  </p>
  </blockquote>
  
  @param <T>
  @param key the key under which this object should be added.
  @param exp the expiration of this object
  @param o the object to store
  @param tc the transcoder to serialize and unserialize the value
  @return a future representing the processing of this operation
  @throws IllegalStateException in the rare circumstance where queue is too
  full to accept any more requests