docs: def set_roles_file(self, path):
          """
          Load all roles from the roles file, and watch for future role
          changes.  When the roles file changes, it will be read and the
          current configuration re-applied so that any role-induced
          changes are processed.
  
          Once loaded, the roles are presented as a set.  If there is
          no role file, the role set is None and role processing is
          inhibited (all tasks are in scope).  If the file exists but
          is empty, then the role set is the empty set, and only tasks
          with no role list will be in scope.  Otherwise the contents
          is parsed as a set of roles, one per line.
      """
          log = self._params.get('log', self._discard)
          if path != self._roles_file:
              if self._roles_file:
                  log.info("Roles file changed from '%s' to '%s'", self._config_file, path)
                  self.file_del(self, paths=[self._roles_file])
              else:
                  log.info("Roles file set to '%s'", path)
              self._roles_file = path
              self.file_add(event_target(self, 'legion_config', log=log), path)
          return self._load_roles()