/** Constructor.
   * Initializes and starts the embedded Fawkes, and loads the nao plugin
   * without precondition.
   * @param broker NaoQi broker to use, will be forwarded to the nao plugin
   * @param name name of the module (no idea why NaoQi wants to pass it
   * as a parameter)
   */
  NaoFawkesModule(AL::ALPtr<AL::ALBroker> broker, const std::string &name)
    : AL::ALModule(broker, name), broker(broker)
  {
    setModuleDescription("Fawkes integration module");

    AL::ALPtr<AL::ALLoggerProxy> logger = broker->getLoggerProxy();

    try {
      logger->info("NaoQiFawkes", "*** Initializing embedded Fawkes");

      // The module flags hack is required because otherwise NaoQi segfaults
      // due to problems with boost static initialization after a module
      // has been closed once, unfortunately that prevents loading a
      // new version of a plugin without a restart.

      fawkes::runtime::InitOptions init_options = 
	fawkes::runtime::InitOptions("naofawkes")
	.plugin_module_flags(fawkes::Module::MODULE_FLAGS_DEFAULT |
			     fawkes::Module::MODULE_NODELETE)
	.net_service_name("NaoQi Fawkes on %h")
        .loggers("console;syslog:NaoQiFawkes")
	.load_plugins("naoqi,webview")
        .default_plugin("nao_default");

      if (fawkes::runtime::init(init_options) != 0) {
	//throw AL::ALError(name, "ctor", "Initializing Fawkes failed");
	logger->info("NaoQiFawkes", "--- Fawkes initialization failed");
        play_sound(RESDIR"/sounds/naoshutdown.wav");
      } else {

	logger->info("NaoQiFawkes", "*** Starting embedded Fawkes");
	fawkes::runtime::main_thread->full_start();
        logger->info("NaoQiFawkes", "*** Embedded Fawkes initialization done");
        play_sound(RESDIR"/sounds/naostartup.wav");
      }
    } catch (fawkes::Exception &e) {
      std::string message;
      for (fawkes::Exception::iterator i = e.begin(); i != e.end(); ++i) {
        if (i != e.begin())  message += "\n";
        message += *i;
      }
      logger->info("NaoQiFawkes",
                   "--- Fawkes initialization failed, exception follows.");
      logger->info("NaoQiFawkes", message);
      play_sound(RESDIR"/sounds/naoshutdown.wav");
      //throw AL::ALError(name, "ctor", e.what());
    }

  }
int
_createModule(AL::ALPtr<AL::ALBroker> broker)
{      
  // init broker with the main broker inctance 
  // from the parent executable

  AL::ALPtr<AL::ALLoggerProxy> logger = broker->getLoggerProxy();

  logger->info("NaoQiFawkes", "*** Setting broker stuff");
  AL::ALBrokerManager::setInstance(broker->fBrokerManager.lock());
  AL::ALBrokerManager::getInstance()->addBroker(broker);

  fawkes::naoqi::broker = broker;
    
  // create modules instance
  logger->info("NaoQiFawkes", "*** Instantiating Module");
  AL::ALModule::createModule<NaoFawkesModule>(broker, "NaoFawkesModule");

  return 0;
}