code: @Override
    public <T> OperationFuture<CASValue<T>> asyncGets(final String key,
        final Transcoder<T> tc) {
  
      final CountDownLatch latch = new CountDownLatch(1);
      final OperationFuture<CASValue<T>> rv =
        new OperationFuture<CASValue<T>>(key, latch, operationTimeout,
        executorService);
  
      Operation op = opFact.gets(key, new GetsOperation.Callback() {
        private CASValue<T> val;
  
        @Override
        public void receivedStatus(OperationStatus status) {
          rv.set(val, status);
        }
  
        @Override
        public void gotData(String k, int flags, long cas, byte[] data) {
          assert key.equals(k) : "Wrong key returned";
          val =
              new CASValue<T>(cas, tc.decode(new CachedData(flags, data,
                  tc.getMaxSize())));
        }
  
        @Override
        public void complete() {
          latch.countDown();
          rv.signalComplete();
        }
      });
      rv.setOperation(op);
      mconn.enqueueOperation(key, op);
      return rv;
    }
docs: Gets (with CAS support) the given key asynchronously.
  
  @param <T>
  @param key the key to fetch
  @param tc the transcoder to serialize and unserialize value
  @return a future that will hold the return value of the fetch
  @throws IllegalStateException in the rare circumstance where queue is too
  full to accept any more requests