def METHOD_NAME(self, step_name, with_save_load=False, set_attribs=None, choice=None, only_one_instance=True):
    if with_save_load:
        self.save_restore()
    self.workflow.do_engine_steps()
    step_name_path = step_name.split("|")
    def switch_workflow(p):
        for task_id, sp in p.workflow._get_outermost_workflow().subprocesses.items():
            if p in sp.get_tasks(workflow=sp):
                return p.workflow.get_task_from_id(task_id)
    def is_match(t):
        if not (t.task_spec.name == step_name_path[-1] or t.task_spec.bpmn_name == step_name_path[-1]):
            return False
        for parent_name in step_name_path[:-1]:
            p = t.parent
            found = False
            while (p and p != p.parent):
                if (p.task_spec.name == parent_name or p.task_spec.bpmn_name == parent_name):
                    found = True
                    break
                if p.parent is None and p.workflow != p.workflow.parent:
                    p = switch_workflow(p)
                else:
                    p = p.parent
            if not found:
                return False
        return True
    tasks = [t for t in self.workflow.get_tasks(TaskState.READY) if is_match(t)]
    self._do_single_step(
        step_name_path[-1], tasks, set_attribs, choice, only_one_instance=only_one_instance)