<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1 +1,22 @@
-require Pathname(__FILE__).dirname + &quot;type_map&quot; + &quot;signature&quot;
\ No newline at end of file
+require Pathname(__FILE__).dirname + &quot;type_map&quot; + &quot;signature&quot;
+
+module Clipper
+  class TypeMap
+
+    def initialize
+      @signatures = java.util.LinkedHashSet.new
+    end
+
+    def &lt;&lt;(signature)
+      unless signature.is_a?(Clipper::TypeMap::Signature)
+        raise ArgumentError.new(&quot;Expected signature to be a #{self.class}::Signature but was #{signature.inspect}&quot;)
+      end
+
+      @signatures &lt;&lt; signature
+    end
+
+    def size
+      @signatures.size
+    end
+  end # class TypeMap
+end # module Clipper
\ No newline at end of file</diff>
      <filename>lib/clipper/type_map.rb</filename>
    </modified>
    <modified>
      <diff>@@ -44,6 +44,26 @@ module Clipper
         convert(@attribute_types, @repository_types, @typecast_right_procedure, args)
       end
 
+      def hash
+        [@attribute_types, @repository_types].hash
+      end
+
+      def eql?(other)
+        other.is_a?(Clipper::TypeMap::Signature) &amp;&amp;
+          @attribute_types == other.attribute_types &amp;&amp;
+          @repository_types == other.repository_types
+      end
+      alias == eql?
+
+      protected
+        def attribute_types
+          @attribute_types
+        end
+
+        def repository_types
+          @repository_types
+        end
+
       private
         def convert(source_types, target_types, typecast_procedure, args)
           matching_types = true</diff>
      <filename>lib/clipper/type_map/signature.rb</filename>
    </modified>
    <modified>
      <diff>@@ -147,4 +147,16 @@ class SignatureTest &lt; Test::Unit::TestCase
     end
   end
 
+  def test_signatures_should_be_type_equal
+    one = Clipper::TypeMap::Signature.new([String], [Integer], lambda { }, lambda { })
+    two = Clipper::TypeMap::Signature.new([String], [Integer], lambda { }, lambda { })
+    three = Clipper::TypeMap::Signature.new([String], [String], lambda { }, lambda { })
+
+    assert_equal(one, two)
+    assert_not_equal(one, three)
+
+    assert_equal(one.hash, two.hash)
+    assert_not_equal(two.hash, three.hash)
+  end
+
 end
\ No newline at end of file</diff>
      <filename>tests/unit/signature_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,64 @@ require &quot;pathname&quot;
 require Pathname(__FILE__).dirname.parent + &quot;helper&quot;
 
 class TypeMapTest &lt; Test::Unit::TestCase
-  def test_should_be_written
+
+  def setup
+    typecast_left_procedure = lambda { |age| age.to_s }
+    typecast_right_procedure = lambda { |age| age.to_i }
+
+    @signature = Clipper::TypeMap::Signature.new(
+      [String],
+      [Integer],
+      typecast_left_procedure,
+      typecast_right_procedure
+    )
+  end
+
+  def test_should_initialize_with_no_dependencies
+    assert_nothing_raised do
+      Clipper::TypeMap.new
+    end
+  end
+
+  def test_can_add_new_signatures
+    typemap = Clipper::TypeMap.new
+    assert_nothing_raised do
+      typemap &lt;&lt; @signature
+    end
+
+    assert_raises(ArgumentError) do
+      typemap &lt;&lt; nil
+    end
+  end
+
+  def test_signatures_are_uniqued
+    typemap = Clipper::TypeMap.new
+
+    assert_nothing_raised do
+      typemap &lt;&lt; @signature
+      typemap &lt;&lt; @signature
+    end
+
+    assert_equal(1, typemap.size)
+
+    duplicate = Clipper::TypeMap::Signature.new(
+      [String],
+      [Integer],
+      lambda { },
+      lambda { }
+    )
+
+    typemap &lt;&lt; duplicate
+    assert_equal(1, typemap.size)
+
+    other = Clipper::TypeMap::Signature.new(
+      [String],
+      [String],
+      lambda { },
+      lambda { }
+    )
+
+    typemap &lt;&lt; other
+    assert_equal(2, typemap.size)
   end
 end
\ No newline at end of file</diff>
      <filename>tests/unit/type_map_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d918af4ef8d8b219a0082a73abb08e94e0b570fd</id>
    </parent>
  </parents>
  <author>
    <name>Sam Smoot</name>
    <email>ssmoot@gmail.com</email>
  </author>
  <url>http://github.com/wiecklabs/clipper/commit/278a858efc60ec4a3d7ca2ac3b0aecf4b5543c9b</url>
  <id>278a858efc60ec4a3d7ca2ac3b0aecf4b5543c9b</id>
  <committed-date>2009-06-22T15:07:33-07:00</committed-date>
  <authored-date>2009-06-22T15:07:33-07:00</authored-date>
  <message>Added Signature equivelency, and some TypeMap basics.</message>
  <tree>e3606e90d7f02b7e7b4d6371bbdcfa821890e2f4</tree>
  <committer>
    <name>Sam Smoot</name>
    <email>ssmoot@gmail.com</email>
  </committer>
</commit>
