/**
 * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.basics.market;

/**
 * An object that can be resolved against reference data.
 * <p>
 * Interface marking those objects that can be resolved using {@link ReferenceData}.
 * Implementations of this interface will use {@linkplain ReferenceDataId identifiers}
 * to refer to key concepts, such as holiday calendars and securities.
 * <p>
 * When the {@code resolve(ReferenceData)} method is called, the identifiers are resolved.
 * The resolving process will take each identifier, look it up using the {@code ReferenceData},
 * and return a new "resolved" instance.
 * Typically the result is of a type that is optimized for pricing.
 * <p>
 * Resolved objects may be bound to data that changes over time, such as holiday calendars.
 * If the data changes, such as the addition of a new holiday, the resolved form will not be updated.
 * Care must be taken when placing the resolved form in a cache or persistence layer.
 * <p>
 * Implementations must be immutable and thread-safe beans.
 * 
 * @param <T>  the type of the resolved result
 */
public interface Resolvable<T> {

  /**
   * Resolves this object using the specified reference data.
   * <p>
   * This converts the object implementing this interface to the equivalent resolved form.
   * All {@link ReferenceDataId} identifiers in this instance will be resolved.
   * The resolved form will typically be a type that is optimized for pricing.
   * <p>
   * Resolved objects may be bound to data that changes over time, such as holiday calendars.
   * If the data changes, such as the addition of a new holiday, the resolved form will not be updated.
   * Care must be taken when placing the resolved form in a cache or persistence layer.
   * 
   * @param refData  the reference data to use when resolving
   * @return the resolved instance
   * @throws ReferenceDataNotFoundException if an identifier cannot be resolved in the reference data
   * @throws RuntimeException if unable to resolve due to an invalid definition
   */
  public abstract T resolve(ReferenceData refData);

}

Add Resolvable interface