/**
 * Copyright (C) 2006 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;

import com.google.inject.binder.BindingBuilder;
import com.google.inject.binder.ConstantBindingBuilder;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.matcher.Matcher;
import com.google.inject.util.Objects;
import com.google.inject.spi.SourceProviders;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInterceptor;

/**
 * A support class for {@link Module Modules} which reduces repetition and
 * results in a more readable configuration. Simply extends this class,
 * implement {@link #configure()}, and call the inherited methods which mirror
 * those found in {@link Binder}. For example:
 *
 * <pre>
 * import static com.google.inject.Names.named;
 *
 * public class MyModule extends AbstractModule {
 *   protected void configure() {
 *     bind(Foo.class).to(FooImpl.class).in(Scopes.CONTAINER);
 *     bind(BarImpl.class);
 *     link(Bar.class).to(BarImpl.class);
 *     bindConstant(named("port")).to(8080);
 *   }
 * }
 * </pre>
 *
 * @author crazybob@google.com (Bob Lee)
 */
public abstract class AbstractModule implements Module {

  static {
    SourceProviders.skip(AbstractModule.class);
  }

  Binder builder;

  public final synchronized void configure(Binder builder) {
    try {
      if (this.builder != null) {
        throw new IllegalStateException("Re-entry is not allowed.");
      }
      this.builder = Objects.nonNull(builder, "builder");

      configure();

    }
    finally {
      this.builder = null;
    }
  }

  /**
   * Configures a {@link Binder} via the exposed methods.
   */
  protected abstract void configure();

  /**
   * Gets the builder.
   */
  protected Binder builder() {
    return builder;
  }

  /**
   * @see Binder#bindScope(Class, Scope)
   */
  protected void scope(Class<? extends Annotation> scopeAnnotation,
      Scope scope) {
    builder.bindScope(scopeAnnotation, scope);
  }

  /**
   * @see Binder#bind(Key)
   */
  protected <T> BindingBuilder<T> bind(Key<T> key) {
    return builder.bind(key);
  }

  /**
   * @see Binder#bind(TypeLiteral)
   */
  protected <T> BindingBuilder<T> bind(
      TypeLiteral<T> typeLiteral) {
    return builder.bind(typeLiteral);
  }

  /**
   * @see Binder#bind(Class)
   */
  protected <T> BindingBuilder<T> bind(Class<T> clazz) {
    return builder.bind(clazz);
  }

  /**
   * @see Binder#link(Key)
   */
  protected <T> LinkedBindingBuilder<T> link(Key<T> key) {
    return builder.link(key);
  }

  /**
   * @see Binder#bindConstant(Class)
   */
  protected ConstantBindingBuilder bindConstant(
      Class<? extends Annotation> annotationType) {
    return builder.bindConstant(annotationType);
  }

  /**
   * @see Binder#bindConstant(java.lang.annotation.Annotation)
   */
  protected ConstantBindingBuilder bindConstant(
      Annotation annotation) {
    return builder.bindConstant(annotation);
  }

  /**
   * @see Binder#install(Module)
   */
  protected void install(Module module) {
    builder.install(module);
  }

  /**
   * @see Binder#requestStaticInjection(Class[])
   */
  protected void requestStaticInjection(Class<?>... types) {
    builder.requestStaticInjection(types);
  }

  /**
   * @see Binder#bindInterceptor(com.google.inject.matcher.Matcher,
   *  com.google.inject.matcher.Matcher,
   *  org.aopalliance.intercept.MethodInterceptor[])
   */
  protected void intercept(Matcher<? super Class<?>> classMatcher,
      Matcher<? super Method> methodMatcher,
      MethodInterceptor... interceptors) {
    builder.bindInterceptor(classMatcher, methodMatcher, interceptors);
  }
}
