@SuppressWarnings("unchecked")
 private static <T extends Writable> T restore(T writable) {
   try {
     return read((T) writable.getClass().newInstance(), write(writable));
   } catch (Exception e) {
     throw new AssertionError(e);
   }
 }
 /**
  * Puts at the specified URI the specified new state of the resource.
  *
  * @param <T> the type of the resource's state.
  * @param uri the URI at which the resource is.
  * @param newResourceState the new state of the resource.
  * @return
  */
 public <T> T putAt(String uri, T newResourceState) {
   Class<T> c = (Class<T>) newResourceState.getClass();
   return resource()
       .path(uri)
       .header(HTTP_SESSIONKEY, getSessionKey())
       .accept(MediaType.APPLICATION_JSON)
       .type(MediaType.APPLICATION_JSON)
       .put(c, newResourceState);
 }
 public <T> T serialize(T o) {
   String jsonString = jsonStreamMapper.write(o);
   System.out.println(jsonString);
   return (T) jsonStreamMapper.readString(jsonString, o.getClass());
 }
 private <T> String tableName(T entity) {
   final Table table = entity.getClass().getAnnotation(Table.class);
   return table == null ? entity.getClass().getSimpleName() : table.value();
 }
 @SuppressWarnings("unchecked")
 protected <T extends Entity> T findEntity(T entity) {
   Select selection = select().all().from(tableName(entity));
   selection.where(eq("id", entity.getId()));
   return (T) template.selectOne(selection, entity.getClass());
 }