code: @Override
    public <T> CASResponse cas(String key, long casId, int exp, T value,
        Transcoder<T> tc) {
      CASResponse casr;
      try {
        OperationFuture<CASResponse> casOp = asyncCAS(key,
                casId, exp, value, tc);
        casr = casOp.get(operationTimeout,
            TimeUnit.MILLISECONDS);
        return casr;
      } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted waiting for value", e);
      } catch (ExecutionException e) {
        if(e.getCause() instanceof CancellationException) {
          throw (CancellationException) e.getCause();
        } else {
          throw new RuntimeException("Exception waiting for value", e);
        }
      } catch (TimeoutException e) {
        throw new OperationTimeoutException("Timeout waiting for value: "
          + buildTimeoutMessage(operationTimeout, TimeUnit.MILLISECONDS), e);
      }
    }
docs: Perform a synchronous CAS operation.
  
  @param <T>
  @param key the key
  @param casId the CAS identifier (from a gets operation)
  @param exp the expiration of this object
  @param value the new value
  @param tc the transcoder to serialize and unserialize the value
  @return a CASResponse
  @throws OperationTimeoutException if global operation timeout is exceeded
  @throws CancellationException if operation was canceled
  @throws IllegalStateException in the rare circumstance where queue is too
  full to accept any more requests