# File lib/map.rb, line 851
  def add(*args)
    case
      when args.empty?
        return []
      when args.size == 1 && args.first.is_a?(Hash)
        hash = args.shift
      else
        hash = {}
        value = args.pop
        key = Array(args).flatten
        hash[key] = value
    end

    exploded = Map.explode(hash)

    exploded[:branches].each do |bkey, btype|
      set(bkey, btype.new) unless get(bkey).is_a?(btype)
    end

    exploded[:leaves].each do |lkey, lvalue|
      set(lkey, lvalue)
    end

    self
  end