def registered_types(selector=:both)
packer, unpacker = registered_types_internal
list = []
case selector
when :both
packer.each_pair do |klass, ary|
type = ary[0]
packer_arg = ary[2]
unpacker_arg = nil
if unpacker.has_key?(type) && unpacker[type][0] == klass
unpacker_arg = unpacker.delete(type)[2]
end
list << {type: type, class: klass, packer: packer_arg, unpacker: unpacker_arg}
end
unpacker.each_pair do |type, ary|
list << {type: type, class: ary[0], packer: nil, unpacker: ary[2]}
end
when :packer
packer.each_pair do |klass, ary|
list << {type: ary[0], class: klass, packer: ary[2]}
end
when :unpacker
unpacker.each_pair do |type, ary|
list << {type: type, class: ary[0], unpacker: ary[2]}
end
else
raise ArgumentError, "invalid selector #{selector}"
end
list.sort{|a, b| a[:type] <=> b[:type] }
end