Author: limpbizkit
Date: Sat Oct 18 12:50:49 2008
New Revision: 644
Modified:
trunk/src/com/google/inject/Injector.java
trunk/src/com/google/inject/InjectorBuilder.java
trunk/src/com/google/inject/InjectorImpl.java
trunk/src/com/google/inject/util/Modules.java
trunk/test/com/google/inject/OverrideModuleTest.java
trunk/test/com/google/inject/ParentInjectorTest.java
Log:
New API: Injector.getParent
Changing Modules.override() to be lazy
Modified: trunk/src/com/google/inject/Injector.java
==============================================================================
--- trunk/src/com/google/inject/Injector.java (original)
+++ trunk/src/com/google/inject/Injector.java Sat Oct 18 12:50:49 2008
@@ -122,6 +122,12 @@
<T> T getInstance(Class<T> type);
/**
+ * Returns this injector's parent injector, or [EMAIL PROTECTED] null} if
this is a
top-
+ * level injector.
+ */
+ Injector getParent();
+
+ /**
* Returns a new injector that inherits all state from this injector. All
* bindings, scopes, interceptors and type converters are inherited --
they
* are visible to the child injector. Elements of the child injector are
not
Modified: trunk/src/com/google/inject/InjectorBuilder.java
==============================================================================
--- trunk/src/com/google/inject/InjectorBuilder.java (original)
+++ trunk/src/com/google/inject/InjectorBuilder.java Sat Oct 18 12:50:49
2008
@@ -321,6 +321,9 @@
public <T> List<Binding<T>> findBindingsByType(TypeLiteral<T> type) {
return this.delegateInjector.findBindingsByType(type);
}
+ public Injector getParent() {
+ return delegateInjector.getParent();
+ }
public Injector createChildInjector(Iterable<? extends Module>
modules) {
return delegateInjector.createChildInjector(modules);
}
Modified: trunk/src/com/google/inject/InjectorImpl.java
==============================================================================
--- trunk/src/com/google/inject/InjectorImpl.java (original)
+++ trunk/src/com/google/inject/InjectorImpl.java Sat Oct 18 12:50:49 2008
@@ -131,6 +131,10 @@
return getBinding(Key.get(type));
}
+ public Injector getParent() {
+ return parent;
+ }
+
public Injector createChildInjector(Iterable<? extends Module> modules) {
return new InjectorBuilder()
.parentInjector(this)
Modified: trunk/src/com/google/inject/util/Modules.java
==============================================================================
--- trunk/src/com/google/inject/util/Modules.java (original)
+++ trunk/src/com/google/inject/util/Modules.java Sat Oct 18 12:50:49 2008
@@ -132,13 +132,13 @@
return with(Arrays.asList(overrides));
}
- public Module with(Iterable<? extends Module> overrides) {
- final List<Element> elements = Elements.getElements(baseModules);
- final List<Element> overrideElements =
Elements.getElements(overrides);
-
+ public Module with(final Iterable<? extends Module> overrides) {
return new AbstractModule() {
@Override
public void configure() {
+ final List<Element> elements = Elements.getElements(baseModules);
+ final List<Element> overrideElements =
Elements.getElements(overrides);
+
final Set<Key> overriddenKeys = Sets.newHashSet();
final Set<Class<? extends Annotation>> overridesScopeAnnotations
= Sets.newHashSet();
Modified: trunk/test/com/google/inject/OverrideModuleTest.java
==============================================================================
--- trunk/test/com/google/inject/OverrideModuleTest.java (original)
+++ trunk/test/com/google/inject/OverrideModuleTest.java Sat Oct 18
12:50:49 2008
@@ -25,6 +25,7 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;
import java.util.Date;
+import java.util.concurrent.atomic.AtomicReference;
import junit.framework.TestCase;
/**
@@ -276,6 +277,25 @@
"1) The scope for @TestScopeAnnotation is bound directly and
cannot be overridden.",
"at ", getClass().getName(), ".configure(");
}
+ }
+
+ public void testOverrideIsLazy() {
+ final AtomicReference<String> value = new AtomicReference<String>("A");
+ Module overridden = Modules.override(new AbstractModule() {
+ protected void configure() {
+
bind(String.class).annotatedWith(named("original")).toInstance(value.get());
+ }
+ }).with(new AbstractModule() {
+ protected void configure() {
+
bind(String.class).annotatedWith(named("override")).toInstance(value.get());
+ }
+ });
+
+ // the value.get() call should be deferred until Guice.createInjector
+ value.set("B");
+ Injector injector = Guice.createInjector(overridden);
+ assertEquals("B", injector.getInstance(Key.get(String.class,
named("original"))));
+ assertEquals("B", injector.getInstance(Key.get(String.class,
named("override"))));
}
@Retention(RUNTIME)
Modified: trunk/test/com/google/inject/ParentInjectorTest.java
==============================================================================
--- trunk/test/com/google/inject/ParentInjectorTest.java (original)
+++ trunk/test/com/google/inject/ParentInjectorTest.java Sat Oct 18
12:50:49 2008
@@ -77,6 +77,15 @@
assertSame(RealB.class, child.getInstance(B.class).getClass());
}
+ public void testGetParent() {
+ Injector top = Guice.createInjector(bindsA);
+ Injector middle = top.createChildInjector(bindsB);
+ Injector bottom = middle.createChildInjector();
+ assertSame(middle, bottom.getParent());
+ assertSame(top, middle.getParent());
+ assertNull(top.getParent());
+ }
+
public void testChildBindingsNotVisibleToParent() {
Injector parent = Guice.createInjector();
parent.createChildInjector(bindsB);
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---