code: def load(self, modules):
          
          self.modules_assoc = []
          for module in modules:
              if not module.enabled:
                  logger.info("Module %s is declared but not enabled", module.name)
                  # Store in our modules list but do not try to load
                  # Probably someone else will load this module later...
                  self.modules[module.uuid] = module
                  continue
              logger.info("Importing Python module '%s' for %s...", module.python_name, module.name)
              try:
                  python_module = importlib.import_module(module.python_name)
  
                  # Check existing module properties
                  # Todo: check all mandatory properties
                  if not hasattr(python_module, 'properties'):  # pragma: no cover
                      self.configuration_errors.append("Module %s is missing a 'properties' "
                                                       "dictionary" % module.python_name)
                      raise AttributeError
                  logger.info("Module properties: %s", getattr(python_module, 'properties'))
  
                  # Check existing module get_instance method
                  if not hasattr(python_module, 'get_instance') or \
                          not isinstance(getattr(python_module, 'get_instance'),
                                         collections.Callable):  # pragma: no cover
                      self.configuration_errors.append("Module %s is missing a 'get_instance' "
                                                       "function" % module.python_name)
                      raise AttributeError
  
                  self.modules_assoc.append((module, python_module))
                  logger.info("Imported '%s' for %s", module.python_name, module.name)
              except ImportError as exp:  # pragma: no cover, simple protection
                  self.configuration_errors.append("Module %s (%s) can't be loaded, Python "
                                                   "importation error: %s" % (module.python_name,
                                                                              module.name,
                                                                              str(exp)))
              except AttributeError:  # pragma: no cover, simple protection
                  self.configuration_errors.append("Module %s (%s) can't be loaded, "
                                                   "module configuration" % (module.python_name,
                                                                             module.name))
              else:
                  logger.info("Loaded Python module '%s' (%s)", module.python_name, module.name)
docs: Load Python modules and check their usability
  
          :param modules: list of the modules that must be loaded
          :return: