def self.make_variant(value)
if value == true
["b", true]
elsif value == false
["b", false]
elsif value.nil?
["b", nil]
elsif value.is_a? Float
["d", value]
elsif value.is_a? Symbol
["s", value.to_s]
elsif value.is_a? Array
["av", value.map {|i| make_variant(i) }]
elsif value.is_a? Hash
h = {}
value.each_key {|k| h[k] = make_variant(value[k]) }
["a{sv}", h]
elsif value.respond_to? :to_str
["s", value.to_str]
elsif value.respond_to? :to_int
i = value.to_int
if -2_147_483_648 <= i && i < 2_147_483_648
["i", i]
else
["x", i]
end
end
end