def merge another_obj
      new_instance =  self.class.new
      # self.clone # Would this be better? What happens to other attributes of the class?
      if block_given?
        self.each do |k,v|
          if another_obj.has_key? k
            new_instance[k] = yield(k, self[k], another_obj[k])
          else
            new_instance[k] = v
          end
        end
      else
        self.each { |k,v| new_instance[k] = v }
        another_obj.each { |k,v| new_instance[k] = v }
      end
      new_instance
    end
def merge another_obj
      new_instance =  self.class.new
      # self.clone # Would this be better? What happens to other attributes of the class?
      if block_given?
        self.each do |k,v|
          if another_obj.has_key? k
            new_instance[k] = yield(k, self[k], another_obj[k])
          else
            new_instance[k] = v
          end
        end
      else
        self.each { |k,v| new_instance[k] = v }
        another_obj.each { |k,v| new_instance[k] = v }
      end
      new_instance
    end
Returns a new instance of this class containing the contents of'
 another_obj. The argument can be any object that implements two
 methods:

    obj.each { |k,v| block }
    obj.has_key?

 If no block is specified, the value for entries with duplicate keys'
 will be those of the argument, but at the index of the original; all'
 other entries will be appended to the end.

 If a block is specified the value for each duplicate key is determined'
 by calling the block with the key, its value in hsh and its value in'
 another_obj.