class IDL::Options

def _merge(to, from, *keys)

def _merge(to, from, *keys)
  keys = keys.flatten.collect { |k| k.to_sym }
  keys = from.keys if keys.empty?
  keys.each do |k|
    if from.has_key?(k)
      v = from[k]
      k = k.to_sym
      if to.has_key?(k)
        case to[k]
        when Array
          to[k].concat v
        when Hash
          to[k].merge!(Hash === v ? v : v.to_h)
        when OpenStruct
          _merge(to[k].__send__(:table), v)
        else
          to[k] = v
        end
      else
        to[k] = v
      end
    end
  end
  to
end