package com.bumptech.glide.load.model;

import android.content.Context;

/**
 * An interface for creating a {@link ModelLoader} for a given model type. Will be retained
 * statically so should not retain {@link Context} or any other objects that cannot be retained for
 * the life of the application. ModelLoaders will not be retained statically so it is safe for any
 * ModelLoader built by this factory to retain a reference to a {@link Context}.
 *
 * @param <T> The type of the model the {@link com.bumptech.glide.load.model.ModelLoader}s built by
 *            this factory can handle
 * @param <Y> The type of data the {@link com.bumptech.glide.load.model.ModelLoader}s built by this
 *            factory can load.
 */
public interface ModelLoaderFactory<T, Y> {

  /**
   * Build a concrete ModelLoader for this model type.
   *
   * @param multiFactory A map of classes to factories that can be used to construct additional
   *                     {@link ModelLoader}s that this factory's {@link ModelLoader} may depend on
   * @return A new {@link ModelLoader}
   */
  ModelLoader<T, Y> build(MultiModelLoaderFactory multiFactory);

  /**
   * A lifecycle method that will be called when this factory is about to replaced.
   */
  void teardown();
}
