/*
 * Copyright (C) 2011 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.inject.spi;

import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Scope;

import java.util.List;

/**
 * Listens for provisioning of objects. Useful for gathering timing information
 * about provisioning, post-provision initialization, and more.
 * 
 * @author sameb@google.com (Sam Berlin)
 * @since 4.0
 */
public interface ProvisionListener {

  /**
   * Invoked by Guice when an object requires provisioning. Provisioning occurs
   * when Guice locates and injects the dependencies for a binding. For types
   * bound to a Provider, provisioning encapsulates the {@link Provider#get}
   * method. For other types, provisioning encapsulates the construction of the
   * object. If a type is bound within a {@link Scope}, provisioning depends on
   * the scope. Types bound in Singleton scope will only be provisioned once.
   * Types bound in no scope will be provisioned every time they are injected.
   * Other scopes define their own behavior for provisioning.
   * <p>
   * To perform the provision, call {@link ProvisionInvocation#provision()}.
   * If you do not explicitly call provision, it will be automatically done after
   * this method returns.  It is an error to call provision more than once.
   */
  <T> void onProvision(ProvisionInvocation<T> provision);

  /** Encapsulates a single act of provisioning.*/ 
  public abstract static class ProvisionInvocation<T> {

    /** Returns the Key which will be provisioned. */
    public abstract Key<T> getKey();

    /** Performs the provision, returning the object provisioned. */
    public abstract T provision();
    
    /** Returns the dependency chain that led to this object being provisioned. */
    public abstract List<DependencyAndSource> getDependencyChain();
  }
}
