Refactoring binding API. Adding support for generic types.

git-svn-id: https://google-guice.googlecode.com/svn/trunk@11 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/guice.iws b/guice.iws
index 7393cff..9030947 100644
--- a/guice.iws
+++ b/guice.iws
@@ -20,14 +20,12 @@
     <list default="true" name="Default" comment="">
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/guice.iws" afterPath="$PROJECT_DIR$/guice.iws" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/Key.java" afterPath="$PROJECT_DIR$/src/com/google/inject/Key.java" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/google/inject/TypeToken.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/Container.java" afterPath="$PROJECT_DIR$/src/com/google/inject/Container.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/com/google/inject/KeyTest.java" afterPath="$PROJECT_DIR$/test/com/google/inject/KeyTest.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/com/google/inject/FactoryTest.java" afterPath="$PROJECT_DIR$/test/com/google/inject/FactoryTest.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/com/google/inject/AllTests.java" afterPath="$PROJECT_DIR$/test/com/google/inject/AllTests.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/ContainerImpl.java" afterPath="$PROJECT_DIR$/src/com/google/inject/ContainerImpl.java" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/com/google/inject/TypeTokenTest.java" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/ContainerBuilder.java" afterPath="$PROJECT_DIR$/src/com/google/inject/ContainerBuilder.java" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/google/inject/ErrorMessage.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/BindingBuilder.java" afterPath="$PROJECT_DIR$/src/com/google/inject/BindingBuilder.java" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/com/google/inject/BindingBuilderTest.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/util/Function.java" afterPath="$PROJECT_DIR$/src/com/google/inject/util/Function.java" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/google/inject/SourceProvider.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/com/google/inject/TypeToken.java" afterPath="$PROJECT_DIR$/src/com/google/inject/TypeToken.java" />
     </list>
   </component>
   <component name="ChangeListSynchronizer" />
@@ -180,55 +178,57 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="BindingBuilder.java" pinned="false" current="false" current-in-tab="false">
+      <file leaf-file-name="BindingBuilder.java" pinned="false" current="true" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/src/com/google/inject/BindingBuilder.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="143" column="51" selection-start="3844" selection-end="3844" vertical-scroll-proportion="1.1169014">
+            <state line="28" column="13" selection-start="826" selection-end="826" vertical-scroll-proportion="0.3278237">
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="AbstractReferenceCache.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/AbstractReferenceCache.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="28" column="15" selection-start="885" selection-end="885" vertical-scroll-proportion="0.25757575">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="ExternalContext.java" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/google/inject/ExternalContext.java">
+      <file leaf-file-name="ReferenceCacheTest.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/test/com/google/inject/util/ReferenceCacheTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="40" column="14" selection-start="1164" selection-end="1164" vertical-scroll-proportion="0.51830983">
+            <state line="29" column="13" selection-start="945" selection-end="945" vertical-scroll-proportion="0.2107438">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Factory.java" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/google/inject/Factory.java">
+      <file leaf-file-name="ReferenceCache.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/ReferenceCache.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="32" column="4" selection-start="954" selection-end="954" vertical-scroll-proportion="0.43098593">
+            <state line="25" column="3" selection-start="846" selection-end="846" vertical-scroll-proportion="0.25757575">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="ContainerImpl.java" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/google/inject/ContainerImpl.java">
+      <file leaf-file-name="SourceProvider.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/SourceProvider.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="72" column="23" selection-start="2310" selection-end="2310" vertical-scroll-proportion="0.7450704">
+            <state line="25" column="0" selection-start="795" selection-end="795" vertical-scroll-proportion="0.25757575">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Binding.java" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/google/inject/Binding.java">
+      <file leaf-file-name="Container.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/Container.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="23" column="13" selection-start="755" selection-end="755" vertical-scroll-proportion="0.21549296">
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="Scope2.java" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/google/inject/Scope2.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state line="21" column="17" selection-start="691" selection-end="691" vertical-scroll-proportion="0.16760564">
+            <state line="64" column="17" selection-start="1877" selection-end="1877" vertical-scroll-proportion="1.0936639">
               <folding />
             </state>
           </provider>
@@ -237,7 +237,7 @@
       <file leaf-file-name="ContainerBuilder.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/google/inject/ContainerBuilder.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="404" column="0" selection-start="12618" selection-end="12618" vertical-scroll-proportion="0.023943663">
+            <state line="14" column="3" selection-start="595" selection-end="595" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -246,7 +246,63 @@
       <file leaf-file-name="Key.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/google/inject/Key.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="37" column="22" selection-start="1090" selection-end="1090" vertical-scroll-proportion="0.33239436">
+            <state line="51" column="26" selection-start="1386" selection-end="1386" vertical-scroll-proportion="0.35123968">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="ErrorMessage.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/ErrorMessage.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="23" column="2" selection-start="751" selection-end="751" vertical-scroll-proportion="0.2107438">
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="PrintStream.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="jar:///Users/crazybob/src.zip!/java/io/PrintStream.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="954" column="26" selection-start="32954" selection-end="32954" vertical-scroll-proportion="0.47796142">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="Formatter.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="jar:///Users/crazybob/src.zip!/java/util/Formatter.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="40" column="11" selection-start="1127" selection-end="1127" vertical-scroll-proportion="-1.6391184">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="BindingBuilderTest.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/test/com/google/inject/BindingBuilderTest.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="25" column="32" selection-start="792" selection-end="792" vertical-scroll-proportion="0.25757575">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="Throwable.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="jar:///Users/crazybob/src.zip!/java/lang/Throwable.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="563" column="32" selection-start="23216" selection-end="23216" vertical-scroll-proportion="0.23415978">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="Scope2.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/google/inject/Scope2.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="21" column="17" selection-start="691" selection-end="691" vertical-scroll-proportion="0.16391185">
               <folding />
             </state>
           </provider>
@@ -255,10 +311,8 @@
       <file leaf-file-name="TypeToken.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/google/inject/TypeToken.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="113" column="14" selection-start="3421" selection-end="3421" vertical-scroll-proportion="0.33239436">
-              <folding>
-                <element signature="imports" expanded="true" />
-              </folding>
+            <state line="159" column="33" selection-start="4511" selection-end="4511" vertical-scroll-proportion="1.1694214">
+              <folding />
             </state>
           </provider>
         </entry>
@@ -266,10 +320,8 @@
       <file leaf-file-name="TypeTokenTest.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/test/com/google/inject/TypeTokenTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="42" column="55" selection-start="1307" selection-end="1307" vertical-scroll-proportion="0.67042255">
-              <folding>
-                <element signature="imports" expanded="true" />
-              </folding>
+            <state line="42" column="55" selection-start="1307" selection-end="1307" vertical-scroll-proportion="0.60881543">
+              <folding />
             </state>
           </provider>
         </entry>
@@ -277,7 +329,7 @@
       <file leaf-file-name="ClassRepository.class" pinned="false" current="false" current-in-tab="false">
         <entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar!/sun/reflect/generics/repository/ClassRepository.class">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="15" column="26" selection-start="851" selection-end="851" vertical-scroll-proportion="0.34244603">
+            <state line="15" column="26" selection-start="851" selection-end="851" vertical-scroll-proportion="0.3347398">
               <folding />
             </state>
           </provider>
@@ -286,16 +338,16 @@
       <file leaf-file-name="Objects.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/Objects.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="23" column="13" selection-start="716" selection-end="716" vertical-scroll-proportion="0.21549296">
+            <state line="23" column="13" selection-start="716" selection-end="716" vertical-scroll-proportion="0.2107438">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="KeyTest.java" pinned="false" current="true" current-in-tab="true">
+      <file leaf-file-name="KeyTest.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/test/com/google/inject/KeyTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="14" column="0" selection-start="291" selection-end="291" vertical-scroll-proportion="0.23943663">
+            <state line="13" column="13" selection-start="264" selection-end="264" vertical-scroll-proportion="0.2107438">
               <folding />
             </state>
           </provider>
@@ -304,7 +356,7 @@
       <file leaf-file-name="AllTests.java" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/test/com/google/inject/AllTests.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="34" column="36" selection-start="1083" selection-end="1083" vertical-scroll-proportion="0.33521128">
+            <state line="34" column="37" selection-start="1084" selection-end="1084" vertical-scroll-proportion="0.3278237">
               <folding />
             </state>
           </provider>
@@ -453,6 +505,28 @@
           <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
         </PATH_ELEMENT>
       </PATH>
+      <PATH>
+        <PATH_ELEMENT>
+          <option name="myItemId" value="guice.ipr" />
+          <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+        </PATH_ELEMENT>
+        <PATH_ELEMENT>
+          <option name="myItemId" value="guice" />
+          <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
+        </PATH_ELEMENT>
+        <PATH_ELEMENT>
+          <option name="myItemId" value="PsiDirectory:$PROJECT_DIR$" />
+          <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+        </PATH_ELEMENT>
+        <PATH_ELEMENT>
+          <option name="myItemId" value="PsiDirectory:$PROJECT_DIR$/src" />
+          <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+        </PATH_ELEMENT>
+        <PATH_ELEMENT>
+          <option name="myItemId" value="PsiDirectory:$PROJECT_DIR$/src/com/google/inject" />
+          <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+        </PATH_ELEMENT>
+      </PATH>
     </subPane>
   </component>
   <component name="ProjectReloadState">
@@ -466,7 +540,7 @@
       <showLibraryContents PackagesPane="false" />
       <hideEmptyPackages />
       <abbreviatePackageNames />
-      <showStructure Scope="false" ProjectPane="false" PackagesPane="false" Favorites="false" />
+      <showStructure Favorites="false" ProjectPane="false" Scope="false" PackagesPane="false" />
       <autoscrollToSource />
       <autoscrollFromSource />
       <sortByType />
@@ -509,21 +583,24 @@
     <key name="CopyClassDialog.RECENTS_KEY">
       <recent name="" />
     </key>
+    <key name="IntroduceConstantDialog.RECENTS_KEY">
+      <recent name="" />
+    </key>
     <key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
       <recent name="com.google.inject.util" />
     </key>
   </component>
   <component name="RestoreUpdateTree" />
-  <component name="RunManager" selected="JUnit.AllTests">
-    <tempConfiguration default="false" name="AllTests" type="JUnit" factoryName="JUnit" enabled="false" merge="false">
+  <component name="RunManager" selected="JUnit.BindingBuilderTest.testStackTraceElement">
+    <tempConfiguration default="false" name="BindingBuilderTest.testStackTraceElement" type="JUnit" factoryName="JUnit" enabled="false" merge="false">
       <pattern value="com.google.inject.*" />
       <module name="guice" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
       <option name="PACKAGE_NAME" value="com.google.inject" />
-      <option name="MAIN_CLASS_NAME" value="com.google.inject.AllTests" />
-      <option name="METHOD_NAME" />
-      <option name="TEST_OBJECT" value="class" />
+      <option name="MAIN_CLASS_NAME" value="com.google.inject.BindingBuilderTest" />
+      <option name="METHOD_NAME" value="testStackTraceElement" />
+      <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" />
       <option name="PARAMETERS" />
       <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
@@ -664,7 +741,7 @@
     </todo-panel>
   </component>
   <component name="ToolWindowManager">
-    <frame x="1" y="22" width="1916" height="1178" extended-state="0" />
+    <frame x="4" y="22" width="1916" height="1200" extended-state="6" />
     <editor active="false" />
     <layout>
       <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="3" />
@@ -672,16 +749,16 @@
       <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="3" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="7" />
       <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.15854311" order="0" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29509714" order="1" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29465094" order="1" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.16236559" order="1" />
-      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.28029603" order="10" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.28014505" order="10" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" order="6" />
       <window_info id="Module Dependencies" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="3" />
       <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="11" />
       <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="3" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.14623655" order="1" />
       <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32919848" order="8" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2904718" order="2" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.29011786" order="2" />
       <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="2" />
       <window_info id="File View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="6" />
       <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3265306" order="4" />
@@ -780,115 +857,115 @@
     <option name="myLastEditedConfigurable" value="Default" />
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/ContainerImpl.java">
+    <entry file="jar:///Users/crazybob/src.zip!/java/util/Formatter.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="72" column="23" selection-start="2310" selection-end="2310" vertical-scroll-proportion="0.7450704">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/BindingBuilder.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="143" column="51" selection-start="3844" selection-end="3844" vertical-scroll-proportion="1.1169014">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/ExternalContext.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="40" column="14" selection-start="1164" selection-end="1164" vertical-scroll-proportion="0.51830983">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/Binding.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="23" column="13" selection-start="755" selection-end="755" vertical-scroll-proportion="0.21549296">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/Scope2.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="21" column="17" selection-start="691" selection-end="691" vertical-scroll-proportion="0.16760564">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="jar:///Users/crazybob/src.zip!/java/lang/ClassLoader.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="2022" column="0" selection-start="70824" selection-end="70824" vertical-scroll-proportion="0.85531914">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/ContainerBuilder.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="404" column="0" selection-start="12618" selection-end="12618" vertical-scroll-proportion="0.023943663">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="jar:///Users/crazybob/src.zip!/java/lang/Class.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="2489" column="9" selection-start="99816" selection-end="99816" vertical-scroll-proportion="0.59859157">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/test/com/google/inject/AllTests.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="34" column="36" selection-start="1083" selection-end="1083" vertical-scroll-proportion="0.33521128">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/Key.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="37" column="22" selection-start="1090" selection-end="1090" vertical-scroll-proportion="0.33239436">
+        <state line="40" column="11" selection-start="1127" selection-end="1127" vertical-scroll-proportion="-1.6391184">
           <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/google/inject/TypeToken.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="113" column="14" selection-start="3421" selection-end="3421" vertical-scroll-proportion="0.33239436">
-          <folding>
-            <element signature="imports" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/test/com/google/inject/TypeTokenTest.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="42" column="55" selection-start="1307" selection-end="1307" vertical-scroll-proportion="0.67042255">
-          <folding>
-            <element signature="imports" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar!/sun/reflect/generics/repository/ClassRepository.class">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="15" column="26" selection-start="851" selection-end="851" vertical-scroll-proportion="0.34244603">
+        <state line="159" column="33" selection-start="4511" selection-end="4511" vertical-scroll-proportion="1.1694214">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/Objects.java">
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/Key.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="23" column="13" selection-start="716" selection-end="716" vertical-scroll-proportion="0.21549296">
+        <state line="51" column="26" selection-start="1386" selection-end="1386" vertical-scroll-proportion="0.35123968">
           <folding />
         </state>
       </provider>
     </entry>
+    <entry file="jar:///Users/crazybob/src.zip!/java/lang/Throwable.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="563" column="32" selection-start="23216" selection-end="23216" vertical-scroll-proportion="0.23415978">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/com/google/inject/BindingBuilderTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="25" column="32" selection-start="792" selection-end="792" vertical-scroll-proportion="0.25757575">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/ErrorMessage.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="23" column="2" selection-start="751" selection-end="751" vertical-scroll-proportion="0.2107438">
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/test/com/google/inject/KeyTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="14" column="0" selection-start="291" selection-end="291" vertical-scroll-proportion="0.23943663">
+        <state line="13" column="13" selection-start="264" selection-end="264" vertical-scroll-proportion="0.2107438">
           <folding />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/test/com/google/inject/AllTests.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="34" column="37" selection-start="1084" selection-end="1084" vertical-scroll-proportion="0.3278237">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/ContainerBuilder.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="14" column="3" selection-start="595" selection-end="595" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/AbstractReferenceCache.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="28" column="15" selection-start="885" selection-end="885" vertical-scroll-proportion="0.25757575">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/com/google/inject/util/ReferenceCacheTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="29" column="13" selection-start="945" selection-end="945" vertical-scroll-proportion="0.2107438">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/util/ReferenceCache.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="25" column="3" selection-start="846" selection-end="846" vertical-scroll-proportion="0.25757575">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/SourceProvider.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="25" column="0" selection-start="795" selection-end="795" vertical-scroll-proportion="0.25757575">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/Container.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="64" column="17" selection-start="1877" selection-end="1877" vertical-scroll-proportion="1.0936639">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/google/inject/BindingBuilder.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="28" column="13" selection-start="826" selection-end="826" vertical-scroll-proportion="0.3278237">
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>
 
diff --git a/src/com/google/inject/BindingBuilder.java b/src/com/google/inject/BindingBuilder.java
index 62e1614..ec6e731 100644
--- a/src/com/google/inject/BindingBuilder.java
+++ b/src/com/google/inject/BindingBuilder.java
@@ -16,50 +16,63 @@
 
 package com.google.inject;
 
-import java.util.ArrayList;
-import java.util.List;
+import static com.google.inject.util.Objects.nonNull;
+import com.google.inject.util.Objects;
+
+import java.util.*;
 
 /**
- * Builds a binding from a type and optional name to a given implementation
- * in a given scope. Uses the given type as the implementation by default.
+ * Builds a binding.
  *
  * @author crazybob@google.com (Bob Lee)
  */
 public class BindingBuilder<T> {
 
-  final Key<T> key;
-  String source;
+  final SourceProvider sourceProvider;
+  Key<T> key;
+  Object source;
   InternalFactory<? extends T> factory;
-  Factory<? extends T> externalFactory;
-  final List<Key<? super T>> exportKeys = new ArrayList<Key<? super T>>();
+  boolean eagerlyLoad = false;
+
+  /**
+   * Keeps error messages in order and prevents duplicates.
+   */
+  Set<ErrorMessage> errorMessages = new LinkedHashSet<ErrorMessage>();
 
   /**
    * Creates a new binding for the given key.
    */
-  public BindingBuilder(Key<T> key) {
-    this.key = key;
+  BindingBuilder(Key<T> key, SourceProvider sourceProvider) {
+    this.key = nonNull(key, "key");
+    this.sourceProvider = nonNull(sourceProvider, "sourceProvider");
   }
 
   /**
-   * Exports this binding.
+   * Specifies that this binding should load as soon as its scope loads. For
+   * example, a singleton will load at startup.
    */
-  public BindingBuilder exportBinding() {
-    return exportBinding(this.key);
+  public BindingBuilder<T> eagerlyLoad() {
+    this.eagerlyLoad = true;
+    return this;
   }
 
   /**
-   * Exports this binding with the given key.
+   * Sets the name of this dependency.
    */
-  public BindingBuilder exportBinding(Key<? super T> exportKey) {
-    this.exportKeys.add(exportKey);
+  public BindingBuilder<T> named(String name) {
+    if (!this.key.hasDefaultName()) {
+      errorMessages.add(
+          new ErrorMessage(source, "Name set more than once."));
+    }
+
+    this.key = this.key.rename(name);
     return this;
   }
 
   /**
    * Sets the implementation to the given class.
    */
-  public <I extends T> BindingBuilder implementation(
-      final Class<I> implementation) {
+  public <I extends T> BindingBuilder<T> to(Class<I> implementation) {
     ensureImplementationIsNotSet();
     this.factory = new DefaultFactory<I>(implementation);
     return this;
@@ -68,11 +81,9 @@
   /**
    * Uses the given factory to create instances of the implementation.
    */
-  public BindingBuilder factory(final Factory<? extends T> factory) {
+  public BindingBuilder<T> to(final Factory<? extends T> factory) {
     ensureImplementationIsNotSet();
 
-    this.externalFactory = factory;
-
     this.factory = new InternalFactory<T>() {
       public T create(InternalContext context) {
         try {
@@ -91,33 +102,40 @@
     return this;
   }
 
-  private <I extends T> void ensureImplementationIsNotSet() {
+  /**
+   * Sets the implementation to the given class.
+   */
+  public BindingBuilder<T> to(Key<? extends T> implementation) {
+    ensureImplementationIsNotSet();
+//    this.factory = new DefaultFactory<I>(implementation);
+    return this;
+  }
+
+  private void ensureImplementationIsNotSet() {
     if (factory != null) {
-      throw new IllegalStateException("An implementation is already set.");
+      errorMessages.add(
+          new ErrorMessage(source, "Implementation set more than once."));
     }
   }
 
   /**
    * Specifies the scope.
    */
-  public BindingBuilder scope(Scope scope) {
+  public BindingBuilder<T> in(Scope scope) {
     if (scope != null) {
-      throw new IllegalStateException("Scope is already set.");
+      errorMessages.add(
+          new ErrorMessage(source, "Scope set more than once."));
     }
 
     return this;
   }
 
   /**
-   * Sets the source string. Useful for debugging. Contents may include the
+   * Sets the source object. Useful for debugging. Contents may include the
    * name of the file and the line number this binding came from, a code
    * snippet, etc.
    */
-  public BindingBuilder source(String source) {
-    if (source != null) {
-      throw new IllegalStateException("Source is already set.");
-    }
-
+  public BindingBuilder<T> from(Object source) {
     this.source = source;
     return this;
   }
diff --git a/src/com/google/inject/ErrorMessage.java b/src/com/google/inject/ErrorMessage.java
new file mode 100644
index 0000000..6fbbd6f
--- /dev/null
+++ b/src/com/google/inject/ErrorMessage.java
@@ -0,0 +1,52 @@
+/**
+ * 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 static com.google.inject.util.Objects.nonNull;
+import com.google.inject.util.Objects;
+
+/**
+ * A configuration error.
+ *
+ * @author crazybob@google.com (Bob Lee)
+ */
+public class ErrorMessage {
+
+  final Object source;
+  final String message;
+
+  public ErrorMessage(Object source, String message) {
+    this.source = nonNull(source, "source");
+    this.message = nonNull(message, "message");
+  }
+
+  public String toString() {
+    return source + " " + message;
+  }
+
+  public int hashCode() {
+    return source.hashCode() * 31 + message.hashCode();
+  }
+
+  public boolean equals(Object o) {
+    if (!(o instanceof ErrorMessage)) {
+      return false;
+    }
+    ErrorMessage e = (ErrorMessage) o;
+    return source.equals(e.source) && message.equals(e.message);
+  }
+}
diff --git a/src/com/google/inject/Key.java b/src/com/google/inject/Key.java
index af1d489..e80931e 100644
--- a/src/com/google/inject/Key.java
+++ b/src/com/google/inject/Key.java
@@ -96,6 +96,20 @@
   }
 
   /**
+   * Returns {@code true} if this key has the default name.
+   */
+  public boolean hasDefaultName() {
+    return DEFAULT_NAME.equals(this.name);
+  }
+
+  /**
+   * Returns a new key with the same type as this key and the given name,
+   */
+  public Key<T> rename(String name) {
+    return new SimpleKey<T>(this.typeToken, name);    
+  }
+
+  /**
    * Gets token representing the type to be injected.
    */
   public TypeToken<T> getTypeToken() {
@@ -138,51 +152,51 @@
    * Gets a key for a {@code Class}. Defaults name to {@link #DEFAULT_NAME}.
    */
   public static <T> Key<T> get(Class<T> type) {
-    return new ManualKey<T>(type, DEFAULT_NAME);
+    return new SimpleKey<T>(type, DEFAULT_NAME);
   }
 
   /**
    * Gets a key for a {@code Class} and a name.
    */
   public static <T> Key<T> get(Class<T> type, String name) {
-    return new ManualKey<T>(type, name);
+    return new SimpleKey<T>(type, name);
   }
 
   /**
    * Gets a key for a type. Defaults name to {@link #DEFAULT_NAME}.
    */
   public static Key<?> get(Type type) {
-    return new ManualKey<Object>(type, DEFAULT_NAME);
+    return new SimpleKey<Object>(type, DEFAULT_NAME);
   }
 
   /**
    * Gets a key for a type and a name.
    */
   public static Key<?> get(Type type, String name) {
-    return new ManualKey<Object>(type, name);
+    return new SimpleKey<Object>(type, name);
   }
 
   /**
    * Gets a key for a type token. Defaults name to {@link #DEFAULT_NAME}.
    */
   public static <T> Key<T> get(TypeToken<T> typeToken) {
-    return new ManualKey<T>(typeToken, DEFAULT_NAME);
+    return new SimpleKey<T>(typeToken, DEFAULT_NAME);
   }
 
   /**
    * Gets key for a type token and a name.
    */
   public static <T> Key<T> get(TypeToken<T> typeToken, String name) {
-    return new ManualKey<T>(typeToken, name);
+    return new SimpleKey<T>(typeToken, name);
   }
 
-  private static class ManualKey<T> extends Key<T> {
+  private static class SimpleKey<T> extends Key<T> {
 
-    private ManualKey(Type type, String name) {
+    private SimpleKey(Type type, String name) {
       super(type, name);
     }
 
-    private ManualKey(TypeToken<T> typeToken, String name) {
+    private SimpleKey(TypeToken<T> typeToken, String name) {
       super(typeToken, name);
     }
   }
diff --git a/src/com/google/inject/SourceProvider.java b/src/com/google/inject/SourceProvider.java
new file mode 100644
index 0000000..f6c9106
--- /dev/null
+++ b/src/com/google/inject/SourceProvider.java
@@ -0,0 +1,33 @@
+/**
+ * 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;
+
+/**
+ * Provides information about the source of configuration to be used in error
+ * messages.
+ *
+ * @author crazybob@google.com (Bob Lee)
+ */
+interface SourceProvider {
+
+  /**
+   * Gets the current source.
+   *
+   * @param depth in call stack
+   */
+  Object currentSource(int depth);
+}
diff --git a/src/com/google/inject/TypeToken.java b/src/com/google/inject/TypeToken.java
index 67a1c43..ef2ec1e 100644
--- a/src/com/google/inject/TypeToken.java
+++ b/src/com/google/inject/TypeToken.java
@@ -75,7 +75,7 @@
    * Gets type token from super class's type parameter.
    */
   static TypeToken<?> fromSuperclassTypeParameter(Class<?> subclass) {
-    return new ManualTypeToken<Object>(getSuperclassTypeParameter(subclass));
+    return new SimpleTypeToken<Object>(getSuperclassTypeParameter(subclass));
   }
 
   @SuppressWarnings({"unchecked"})
@@ -147,18 +147,18 @@
    * Gets type token for the given {@code Type} instance.
    */
   public static TypeToken<?> get(Type type) {
-    return new ManualTypeToken<Object>(type);
+    return new SimpleTypeToken<Object>(type);
   }
 
   /**
    * Gets type token for the given {@code Class} instance.
    */
   public static <T> TypeToken<T> get(Class<T> type) {
-    return new ManualTypeToken<T>(type);
+    return new SimpleTypeToken<T>(type);
   }
 
-  private static class ManualTypeToken<T> extends TypeToken<T> {
-    public ManualTypeToken(Type type) {
+  private static class SimpleTypeToken<T> extends TypeToken<T> {
+    public SimpleTypeToken(Type type) {
       super(type);
     }
   }
diff --git a/src/com/google/inject/util/Function.java b/src/com/google/inject/util/Function.java
index 8d5a349..bf71794 100644
--- a/src/com/google/inject/util/Function.java
+++ b/src/com/google/inject/util/Function.java
@@ -22,7 +22,7 @@
  * <code>Function&lt;String,Integer&gt;</code> and transform integers in String
  * format to Integer format.
  *
- * <p>The transformation on the source object does not necessarily result in
+ * <p>The transformation on the from object does not necessarily result in
  * an object of a different type.  For example, a
  * {@code FarenheitToCelciusFunction} may implement
  * <code>Function&lt;Float,Float&gt;</code>.
@@ -37,7 +37,7 @@
    * of type {@code T}.  Note that types {@code F} and {@code T} may or may not
    * be the same.
    *
-   * @param from The source object.
+   * @param from The from object.
    * @return The resulting object.
    */
   T apply(F from);
diff --git a/test/com/google/inject/BindingBuilderTest.java b/test/com/google/inject/BindingBuilderTest.java
new file mode 100644
index 0000000..95bad9c
--- /dev/null
+++ b/test/com/google/inject/BindingBuilderTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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 junit.framework.TestCase;
+
+/**
+ * @author crazybob@google.com (Bob Lee)
+ */
+public class BindingBuilderTest extends TestCase {
+
+  public void testStackTraceElement() {
+    System.err.println(new Throwable().getStackTrace()[0]);
+  }
+}