Loads all subclasses of BaseTask from modules that are contained in supplied directory paths or direct module paths

        :param propagate_exception: a flag that indicates if exceptions from single file import shall be raised during the
            whole directory lookup
        :param paths: an iterable of fully qualified paths to python modules / directories, from where we import subclasses of BaseClass
        :type paths: `iterable`(`str`)
        :return: a dict of CustomTasks, where key is CustomTask.name, and value is a CustomClass task itself
        :rtype: `dict`

def load_tasks(self, paths, propagate_exception=False):
        """ Loads all subclasses of BaseTask from modules that are contained in supplied directory paths or direct module paths

        :param propagate_exception: a flag that indicates if exceptions from single file import shall be raised during the
            whole directory lookup
        :param paths: an iterable of fully qualified paths to python modules / directories, from where we import subclasses of BaseClass
        :type paths: `iterable`(`str`)
        :return: a dict of CustomTasks, where key is CustomTask.name, and value is a CustomClass task itself
        :rtype: `dict`
        """
        try:
            result = {}
            for path in paths:
                try:
                    if os.path.isdir(path):
                        result.update(self.load_tasks_from_dir(dir_path=path, propagate_exceptions=propagate_exception))
                    elif os.path.isfile(path):
                        result.update(self.load_tasks_from_file(file_path=path))
                except (GOSTaskException, GOSIOException):
                    if propagate_exception:
                        raise
            return result
        except TypeError:
            raise GOSTaskException("Argument for `load_tasks` method must be iterable")