def match(tuple)
      return false unless tuple.respond_to?(:size)
      return false unless tuple.respond_to?(:fetch)
      return false unless self.size == tuple.size
      each do |k, v|
        begin
          it = tuple.fetch(k)
        rescue
          return false
        end
        next if v.nil?
        next if v == it
        next if v === it
        return false
      end
      return true
    end
def match(tuple)
      return false unless tuple.respond_to?(:size)
      return false unless tuple.respond_to?(:fetch)
      return false unless self.size == tuple.size
      each do |k, v|
        begin
          it = tuple.fetch(k)
        rescue
          return false
        end
        next if v.nil?
        next if v == it
        next if v === it
        return false
      end
      return true
    end
Matches this template against +tuple+.  The +tuple+ must be the same
 size as the template.  An element with a +nil+ value in a template acts
 as a wildcard, matching any value in the corresponding position in the
 tuple.  Elements of the template match the +tuple+ if the are #== or
 #===.

   Template.new([:foo, 5]).match   Tuple.new([:foo, 5]) # => true
   Template.new([:foo, nil]).match Tuple.new([:foo, 5]) # => true
   Template.new([String]).match    Tuple.new(['hello']) # => true

   Template.new([:foo]).match      Tuple.new([:foo, 5]) # => false
   Template.new([:foo, 6]).match   Tuple.new([:foo, 5]) # => false
   Template.new([:foo, nil]).match Tuple.new([:foo])    # => false
   Template.new([:foo, 6]).match   Tuple.new([:foo])    # => false