@SuppressWarnings("unchecked")
  public synchronized <T> DataRewinder<T> build(T data) {
    Preconditions.checkNotNull(data);
    DataRewinder.Factory result = rewinders.get(data.getClass());
    if (result == null) {
      for (DataRewinder.Factory<?> registeredFactory : rewinders.values()) {
        if (registeredFactory.getDataClass().isAssignableFrom(data.getClass())) {
          result = registeredFactory;
          break;
        }
      }
    }

    if (result == null) {
      result = DEFAULT_FACTORY;
    }
    return result.build(data);
  }
 public synchronized void register(DataRewinder.Factory factory) {
   rewinders.put(factory.getDataClass(), factory);
 }