More listener changes:
 - we now support user-supplied MembersInjectors. These execute before InjectionListeners, enabling a two-phase injection
 - renamed InjectableTypeListenerBinding to TypeListenerBinding

git-svn-id: https://google-guice.googlecode.com/svn/trunk@927 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/src/com/google/inject/EncounterImpl.java b/src/com/google/inject/EncounterImpl.java
index 468ee42..33f462e 100644
--- a/src/com/google/inject/EncounterImpl.java
+++ b/src/com/google/inject/EncounterImpl.java
@@ -36,6 +36,7 @@
 
   private final Errors errors;
   private final Lookups lookups;
+  private List<MembersInjector<? super T>> membersInjectors; // lazy
   private List<InjectionListener<? super T>> injectionListeners; // lazy
   private List<MethodAspect> aspects; // lazy
   private boolean valid = true;
@@ -55,13 +56,28 @@
         : ImmutableList.copyOf(aspects);
   }
 
+  public ImmutableList<MembersInjector<? super T>> getMembersInjectors() {
+    return membersInjectors == null
+        ? ImmutableList.<MembersInjector<? super T>>of()
+        : ImmutableList.copyOf(membersInjectors);
+  }
+
   public ImmutableList<InjectionListener<? super T>> getInjectionListeners() {
     return injectionListeners == null
         ? ImmutableList.<InjectionListener<? super T>>of()
         : ImmutableList.copyOf(injectionListeners);
   }
 
-  @SuppressWarnings("unchecked") // an InjectionListener<? super T> is an InjectionListener<T>
+  public void register(MembersInjector<? super T> membersInjector) {
+    checkState(valid, "Encounters may not be used after hear() returns.");
+
+    if (membersInjectors == null) {
+      membersInjectors = Lists.newArrayList();
+    }
+
+    membersInjectors.add(membersInjector);
+  }
+
   public void register(InjectionListener<? super T> injectionListener) {
     checkState(valid, "Encounters may not be used after hear() returns.");