def generate_header(self):
        file_path = io_utils.cpp_object_header_path(self.group_name, self.class_name)
        output_header = open(file_path, 'w')

        def_guard = '#ifndef LESSCHATCORE_{0}_{1}_H_\n#define LESSCHATCORE_{0}_{1}_H_'.format(
                self.group_name.upper().replace('/', '_'), CppClass.__convert_class_name_to_file_name(self.class_name).upper())
        end_def_guard = '#endif /* defined(LESSCHATCORE_{0}_{1}_H_) */'.format(
                self.group_name.upper().replace('/', '_'), CppClass.__convert_class_name_to_file_name(self.class_name).upper())
        cpp_include = '#include <string>\n#include <memory>\n#include <vector>\n\n#include "base/base.h"'
        cpp_class_begin = 'class LCC_DLL {0} : public CodingInterface {{'.format(self.class_name)
        cpp_class_end = '};'
        cpp_constructor = '{0}();'.format(self.class_name)
        cpp_deconstructor = 'virtual ~{0}();'.format(self.class_name)
        cpp_init_method = self.__generate_init_method_declarasion()
        cpp_clone = 'std::unique_ptr<{0}> Clone() const;'.format(self.class_name)
        cpp_getter_setter_split = '// Getter/Setter --------------------------------------------------------'
        cpp_variable_split = '// Variable --------------------------------------------------------'
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(self.class_name)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(_CPP_NAMESPACE_BEGIN + _CPP_BR)

        if self.class_comment is not None:
            comment = self.__find_replacement_by_define_name(self.class_comment)
            output_header.write('{0}'.format(comment))

        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        for cpp_enum in self.cpp_enum_list:
            output_header.write(cpp_enum.generate_cpp_enum(_CPP_SPACE) + '\n')

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_clone + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_CODING_INTERFACE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + _CPP_INIT_WITH_JSON_DECLARATION + _CPP_BR)

        output_header.write(_CPP_SPACE + cpp_getter_setter_split + _CPP_BR)

        for cpp_var in self.cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.getter() + '\n')
            output_header.write(_CPP_SPACE + cpp_var.setter() + _CPP_BR)

        output_header.write(_CPP_PRIVATE + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_variable_split + _CPP_BR)

        for cpp_var in self.cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.private_var() + '\n')
        output_header.write(_CPP_BR)

        output_header.write(_CPP_SPACE + cpp_disallow_copy_and_assign + '\n')
        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(_CPP_NAMESPACE_END + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
    def generate_header(self):
        """Generates C++ Object header file.
        """
        file_path = io_utils.cpp_object_header_path(self.__group_name,
                                                    self.__class_name)
        output_header = open(file_path, 'w')

        def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(self.__class_name).upper(),
            self.__config.cpp_module_name)
        end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(self.__class_name).upper(),
            self.__config.cpp_module_name)
        cpp_include = '#include <string>\n#include <memory>\n#include <vector>\n\n#include "base/base.h"'
        cpp_class_begin = 'class LCC_DLL {0} : public CodingInterface {{'.format(
            self.__class_name)
        cpp_class_end = '};'
        cpp_constructor = '{0}();'.format(self.__class_name)
        cpp_deconstructor = 'virtual ~{0}();'.format(self.__class_name)
        cpp_init_method = self.__generate_init_method_declarasion()
        cpp_clone = 'std::unique_ptr<{0}> Clone() const;'.format(
            self.__class_name)
        cpp_getter_setter_split = '// Getter/Setter --------------------------------------------------------'
        cpp_variable_split = '// Variable --------------------------------------------------------'
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(
            self.__class_name)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(self.__config.cpp_ns_begin + _CPP_BR)

        if self.__class_comment is not None:
            comment = self.__find_replacement_by_define_name(
                self.__class_comment)
            output_header.write('{0}'.format(comment))

        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        for cpp_enum in self.__cpp_enum_list:
            output_header.write(cpp_enum.generate_cpp_enum(_CPP_SPACE) + '\n')

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_clone + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_CODING_INTERFACE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + _CPP_INIT_WITH_JSON_DECLARATION +
                            _CPP_BR)

        output_header.write(_CPP_SPACE + cpp_getter_setter_split + _CPP_BR)

        for cpp_var in self.__cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.getter() + '\n')
            output_header.write(_CPP_SPACE + cpp_var.setter() + _CPP_BR)

        output_header.write(_CPP_PRIVATE + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_variable_split + _CPP_BR)

        for cpp_var in self.__cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.private_var() + '\n')
        output_header.write(_CPP_BR)

        output_header.write(_CPP_SPACE + cpp_disallow_copy_and_assign + '\n')
        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(self.__config.cpp_ns_end + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
    def generate_manager_header(self):
        if self.cpp_manager_or_none is None:
            return

        cpp_manager = self.cpp_manager_or_none
        file_path = io_utils.cpp_object_header_path(self.group_name, cpp_manager.class_name())
        output_header = open(file_path, 'w')

        def_guard = '#ifndef LESSCHATCORE_{0}_{1}_H_\n#define LESSCHATCORE_{0}_{1}_H_'.format(
                self.group_name.upper().replace('/', '_'), CppClass.__convert_class_name_to_file_name(cpp_manager.class_name()).upper())
        end_def_guard = '#endif /* defined(LESSCHATCORE_{0}_{1}_H_) */'.format(
                self.group_name.upper().replace('/', '_'), CppClass.__convert_class_name_to_file_name(cpp_manager.class_name()).upper())
        cpp_include = '#include <string>\n' \
                      '#include <memory>\n' \
                      '#include <vector>\n' \
                      '#include <functional>\n\n' \
                      '#include "easySQLite/easySQLite.h"\n\n' \
                      '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n'
        cpp_include += '#include "{0}/{1}.h"'.format(self.group_name.replace('core/', ''), CppClass.__convert_class_name_to_file_name(self.class_name))
        cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format(cpp_manager.class_name())
        cpp_class_end = '};'
        cpp_constructor = 'explicit {0}(Director* director);'.format(cpp_manager.class_name())
        cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name())
        cpp_init_method = 'bool InitOrDie();'
        cpp_default_manager = 'static const {0}* DefaultManager();'.format(cpp_manager.class_name())
        cpp_manager_save_methods = cpp_manager.generate_save_declarations(_CPP_SPACE)
        cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations(_CPP_SPACE)
        cpp_manager_delete_methods = cpp_manager.generate_delete_declarations(_CPP_SPACE)
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(cpp_manager.class_name())
        cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations(_CPP_SPACE)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(_CPP_NAMESPACE_BEGIN + _CPP_BR)
        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_http_methods)

        output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_save_methods)
        output_header.write(cpp_manager_fetch_methods)
        output_header.write(cpp_manager_delete_methods)

        output_header.write(_CPP_PRIVATE + '\n')
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var(table_name) + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration(table_name) + _CPP_BR)

        output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE))
        for table_name in cpp_manager.table_name_list:
            output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name))

        output_header.write(_CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() + _CPP_BR)

        output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign + '\n')

        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(_CPP_NAMESPACE_END + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
    def generate_manager_header(self):
        """Generates C++ Object Manager header.
        """
        if self.__cpp_manager_or_none is None:
            return

        cpp_manager = self.__cpp_manager_or_none
        file_path = io_utils.cpp_object_header_path(self.__group_name,
                                                    cpp_manager.class_name())
        output_header = open(file_path, 'w')

        def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
            self.__config.cpp_module_name)
        end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
            self.__config.cpp_module_name)
        cpp_include = '#include <string>\n' \
                      '#include <memory>\n' \
                      '#include <vector>\n' \
                      '#include <functional>\n\n' \
                      '#include "easySQLite/easySQLite.h"\n\n' \
                      '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n'
        cpp_include += '#include "{0}/{1}.h"'.format(
            self.__group_name.replace('core/', ''),
            cpp_class_name_to_cpp_file_name(self.__class_name))
        cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format(
            cpp_manager.class_name())
        cpp_class_end = '};'
        cpp_constructor = 'explicit {0}(Director* director);'.format(
            cpp_manager.class_name())
        cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name())
        cpp_init_method = 'bool InitOrDie();'
        cpp_default_manager = 'static const {0}* DefaultManager();'.format(
            cpp_manager.class_name())
        cpp_manager_save_methods = cpp_manager.generate_save_declarations(
            _CPP_SPACE)
        cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations(
            _CPP_SPACE)
        cpp_manager_delete_methods = cpp_manager.generate_delete_declarations(
            _CPP_SPACE)
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(
            cpp_manager.class_name())
        cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations(
            _CPP_SPACE)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(self.__config.cpp_ns_begin + _CPP_BR)
        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_http_methods)

        output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_save_methods)
        output_header.write(cpp_manager_fetch_methods)
        output_header.write(cpp_manager_delete_methods)

        output_header.write(_CPP_PRIVATE + '\n')
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() +
                            _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE +
                                cpp_manager.sqlite_table_var(table_name) +
                                _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE +
                            cpp_manager.sqlite_record_by_object_declaration() +
                            _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(
                _CPP_SPACE +
                cpp_manager.sqlite_record_by_object_declaration(table_name) +
                _CPP_BR)

        output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE))
        for table_name in cpp_manager.table_name_list:
            output_header.write(
                cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name))

        output_header.write(
            _CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() +
            _CPP_BR)

        output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign +
                            '\n')

        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(self.__config.cpp_ns_end + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)