def method_missing(method, *args)
      methodname = method.to_s
      if methodname.slice(-1, 1) == '='
        if args.size != 1
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)")
        end
        tags[methodname.chop] = args[0]
      elsif methodname.slice(-1, 1) == '?'
        if args.size != 0
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
        end
        tags[methodname.chop] =~ /^(true|yes|1)$/
      else
        if args.size != 0
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
        end
        tags[methodname]
      end
    end
def method_missing(method, *args)
      methodname = method.to_s
      if methodname.slice(-1, 1) == '='
        if args.size != 1
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)")
        end
        tags[methodname.chop] = args[0]
      elsif methodname.slice(-1, 1) == '?'
        if args.size != 0
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
        end
        tags[methodname.chop] =~ /^(true|yes|1)$/
      else
        if args.size != 0
          raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
        end
        tags[methodname]
      end
    end
All other methods are mapped so its easy to access tags: For
 instance obj.name is the same as obj.tags['name']. This works
 for getting and setting tags.

   node = Rosemary::Node.new
   node.add_tags( 'highway' => 'residential', 'name' => 'Main Street' )
   node.highway                   #=> 'residential'
   node.highway = 'unclassified'  #=> 'unclassified'
   node.name                      #=> 'Main Street'

 In addition methods of the form <tt>key?</tt> are used to
 check boolean tags. For instance +oneway+ can be 'true' or
 'yes' or '1', all meaning the same.

   way.oneway?

 will check this. It returns true if the value of this key is
 either 'true', 'yes' or '1'.