class Client {

  public void put(String tableName, Put put) {
    // Get the KeyValue list
    Iterable<CKeyValue> keyValueList = put.getKeyValueList();
    List<CKeyValue> indexValues = new ArrayList<CKeyValue>();
    // for each index, add only the keyvalues that should be indexed
    for (Index index : getIndices()) {
      indexValues.clear();
      for (CKeyValue keyValue : keyValueList) {
        if (Bytes.compareTo(index.getColumnFamily(), keyValue.getFamily()) == 0) {
          if (Bytes.compareTo(index.getColumnQualifier(),
              keyValue.getQualifier()) == 0) {
            indexValues.add(keyValue);
          }
        }
      }
      index.handlePut(new Put(indexValues));
    }
    // TODO this is obviously not performant for every put
    // we should probably do some caching here
    DatabaseAdapter db = getDatabaseAdapter();
    if (!db.verify())
      throw new RuntimeException(
          "Could not connect to the database to make the put of the actual value. Index may be corrupt.");
    db.getTableAdapter(tableName).put(put);
  }

  public  Client(Configuration conf);

}