Fixing a bug in the unique annotation in throwingproviderbinder

git-svn-id: https://google-guice.googlecode.com/svn/trunk@427 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java b/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java
index 58c7985..94c14d8 100644
--- a/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java
+++ b/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java
@@ -16,24 +16,15 @@
 
 package com.google.inject.throwingproviders;
 
-import com.google.inject.Binder;
-import com.google.inject.BindingAnnotation;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
+import com.google.inject.*;
 import com.google.inject.binder.ScopedBindingBuilder;
 import com.google.inject.internal.Objects;
+
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
+import java.lang.reflect.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>Builds a binding for an {@link ThrowingProvider} using a fluent API:
@@ -250,14 +241,35 @@
    * instances, for use in creating distinct {@link Key}s.
    */
   private static Annotation uniqueAnnotation() {
-    return new Annotation() {
+    final int value = nextUniqueValue.getAndIncrement();
+    return new Internal() {
+      public int value() {
+        return value;
+      }
+
       public Class<? extends Annotation> annotationType() {
         return Internal.class;
       }
+
+      @Override public String toString() {
+        return "@" + Internal.class.getName() + "(value=" + value + ")";
+      }
+
+      @Override public boolean equals(Object o) {
+        return o instanceof Internal
+            && ((Internal) o).value() == value();
+      }
+
+      @Override public int hashCode() {
+        return 127 * "value".hashCode() ^ value;
+      }
     };
   }
   @Retention(RUNTIME) @BindingAnnotation
-  private @interface Internal { }
+  private @interface Internal {
+    int value();
+  }
+  private static final AtomicInteger nextUniqueValue = new AtomicInteger(1);
 
   /**
    * Represents the returned value from a call to {@link