void load_helper_modules (void)
{
    SCIM_DEBUG_MAIN (1) << "load_helper_modules ()\n";

    std::vector <String> mod_list;

    scim_get_helper_module_list (mod_list);

    if (mod_list.size ()) {
        HelperModule module;

        for (size_t i = 0; i < mod_list.size (); ++i) {

            SCIM_DEBUG_MAIN (2) << " Load module: " << mod_list [i] << "\n";

            if (module.load (mod_list [i]) && module.valid ()) {
                HelperInfo info;
                size_t num = module.number_of_helpers ();

                SCIM_DEBUG_MAIN (2) << " Find " << num << " Helpers:\n";

                for (size_t j = 0; j < num; ++j) {
                    if (module.get_helper_info (j, info)) {
                        SCIM_DEBUG_MAIN (3) << "  " << info.uuid << ": " << info.name << "\n";
                        __helpers.push_back ( std::make_pair (info, mod_list [i]) );
                    }
                }
            }

            module.unload ();
        }
    }
}
void load_helper_modules (void)
{
    SCIM_DEBUG_MAIN (1) << "load_helper_modules ()\n";

    std::vector <String> mod_list;

    scim_get_helper_module_list (mod_list);

    // NOTE on FreeBSD if some module is loaded and unloaded right away here the following module crashes for some unknown reason
    //      seems like some damage is being done by module.unload();
    //      so I added a workaround: have an array of modules and unload them all together in the end only.
    //      TODO Need to figure out what's going on with this issue.

    if (mod_list.size ()) {

        HelperModule *module = new HelperModule[mod_list.size ()];

        for (size_t i = 0; i < mod_list.size (); ++i) {

            SCIM_DEBUG_MAIN (2) << " Load module: " << mod_list [i] << "\n";

            if (module[i].load (mod_list [i]) && module[i].valid ()) {
                HelperInfo info;
                size_t num = module[i].number_of_helpers ();

                SCIM_DEBUG_MAIN (2) << " Find " << num << " Helpers:\n";

                for (size_t j = 0; j < num; ++j) {
                    if (module[i].get_helper_info (j, info)) {
                        SCIM_DEBUG_MAIN (3) << "  " << info.uuid << ": " << info.name << "\n";
                        __helpers.push_back ( std::make_pair (info, mod_list [i]) );
                    }
                }
            }
        }
        for (size_t i = 0; i < mod_list.size (); ++i) {
            module[i].unload ();
        }
        delete[] module;
    }
}