blob: 5d6a735fc844a40e0ff18d17a1cc514e6ee7d792 [file] [log] [blame]
// Copyright 2006 Google Inc. All Rights Reserved.
package com.google.inject;
import com.google.inject.util.Objects;
import com.google.inject.spi.ErrorMessage;
import java.util.Map;
import java.util.Properties;
/**
* A support class for {@link Module}s 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 ContainerBuilder}.
*
* @author crazybob@google.com (Bob Lee)
*/
public abstract class AbstractModule implements Module {
ContainerBuilder builder;
public final synchronized void configure(ContainerBuilder 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 ContainerBuilder} via the exposed methods.
*/
protected abstract void configure();
/**
* @see ContainerBuilder#put(String, Scope)
*/
protected void put(String name, Scope scope) {
builder.put(name, scope);
}
/**
* @see ContainerBuilder#bind(Key)
*/
protected <T> ContainerBuilder.BindingBuilder<T> bind(Key<T> key) {
return builder.bind(key);
}
/**
* @see ContainerBuilder#bind(TypeToken)
*/
protected <T> ContainerBuilder.BindingBuilder<T> bind(TypeToken<T> typeToken) {
return builder.bind(typeToken);
}
/**
* @see ContainerBuilder#bind(Class)
*/
protected <T> ContainerBuilder.BindingBuilder<T> bind(Class<T> clazz) {
return builder.bind(clazz);
}
/**
* @see ContainerBuilder#link(Key)
*/
protected <T> ContainerBuilder.LinkedBindingBuilder<T> link(Key<T> key) {
return builder.link(key);
}
/**
* @see ContainerBuilder#bind(String)
*/
protected ContainerBuilder.ConstantBindingBuilder bind(String name) {
return builder.bind(name);
}
/**
* @see ContainerBuilder#bindProperties(java.util.Map)
*/
protected void bindProperties(Map<String, String> properties) {
builder.bindProperties(properties);
}
/**
* @see ContainerBuilder#bindProperties(java.util.Properties)
*/
protected void bindProperties(Properties properties) {
builder.bindProperties(properties);
}
/**
* @see ContainerBuilder#requestStaticInjection(Class[])
*/
protected void requestStaticInjection(Class<?>... types) {
builder.requestStaticInjection(types);
}
/**
* @see ContainerBuilder#add(com.google.inject.spi.ErrorMessage)
*/
protected void add(ErrorMessage errorMessage) {
builder.add(errorMessage);
}
/**
* @see ContainerBuilder#apply(Module)
*/
protected void apply(Module module) {
builder.apply(module);
}
}