/*
 * Copyright (C) 2007 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.util;

import com.google.inject.Provider;

/**
 * Static utility methods for creating and working with instances of
 * {@link Provider}.
 *
 * @author Kevin Bourrillion (kevinb9n@gmail.com)
 * @since 2.0
 */
public final class Providers {

  private Providers() {}

  /**
   * Returns a provider which always provides {@code instance}.  This should not
   * be necessary to use in your application, but is helpful for several types
   * of unit tests.
   *
   * @param instance the instance that should always be provided.  This is also
   *     permitted to be null, to enable aggressive testing, although in real
   *     life a Guice-supplied Provider will never return null.
   */
  public static <T> Provider<T> of(final T instance) {
    return new Provider<T>() {
      public T get() {
        return instance;
      }

      @Override public String toString() {
        return "of(" + instance + ")";
      }
    };
  }
}
