def METHOD_NAME(self):
    add_code = ''
    remove_code = ''
    const_get_code = ''
    get_code = ''
    visit_code = ''
    map_code = ''
    for handle_name in sorted(self.handle_names):
        if handle_name in self.DUPLICATE_HANDLE_TYPES:
            continue
        handle_name = handle_name[2:]
        handle_info = handle_name + 'Info'
        handle_map = handle_name[0].lower() + handle_name[1:] + '_map_'
        add_code += '    void Add{0}({0}&& info) {{ AddObjectInfo(std::move(info), &{1}); }}\n'.format(handle_info, handle_map)
        remove_code += '    void Remove{0}(format::HandleId id) {{ {1}.erase(id); }}\n'.format(handle_info, handle_map)
        const_get_code += '    const {0}* Get{0}(format::HandleId id) const {{ return GetObjectInfo<{0}>(id, &{1}); }}\n'.format(handle_info, handle_map)
        get_code += '    {0}* Get{0}(format::HandleId id) {{ return GetObjectInfo<{0}>(id, &{1}); }}\n'.format(handle_info, handle_map)
        visit_code += '    void Visit{0}(std::function<void(const {0}*)> visitor) const {{  for (const auto& entry : {1}) {{ visitor(&entry.second); }}  }}\n'.format(handle_info, handle_map)
        map_code += '     std::unordered_map<format::HandleId, {0}> {1};\n'.format(handle_info, handle_map)
    self.newline()
    code = 'class VulkanObjectInfoTableBase2 : VulkanObjectInfoTableBase\n'
    code += '{\n'
    code += '  public:\n'
    code += '    VulkanObjectInfoTableBase2() {}\n'
    code += '    ~VulkanObjectInfoTableBase2() {}\n'
    code += '\n'
    code += add_code
    code += '\n'
    code += remove_code
    code += '\n'
    code += const_get_code
    code += '\n'
    code += get_code
    code += '\n'
    code += visit_code
    code += '\n'
    code += '  protected:\n'
    code += map_code
    code += '};\n'
    write(code, file=self.outFile)