def METHOD_NAME(self) -> None:
    from starwhale.api._impl.evaluation import PipelineHandler
    console.debug(f"start to execute step: {repr(self.step)}")
    module = load_module(self.step.module_name, self.workdir)
    cls_ = getattr(module, self.step.cls_name, None)
    if cls_ is None:
        # for internal function
        if "." in self.step.func_name:
            # execute class method
            cls_name, func_name = self.step.func_name.split(".")
            cls_ = getattr(module, cls_name)
            func = getattr(cls_, func_name)
            func(**self.step.asdict(), workdir=self.workdir)
        else:
            func = getattr(module, self.step.func_name)
            if getattr(func, DecoratorInjectAttr.Evaluate, False):
                self._run_in_pipeline_handler_cls(func, "evaluate")
            elif getattr(func, DecoratorInjectAttr.Predict, False):
                self._run_in_pipeline_handler_cls(func, "predict")
            elif getattr(func, DecoratorInjectAttr.Step, False):
                if self.handler_args:
                    func(**{"handler_args": self.handler_args})
                else:
                    func()
            else:
                raise NoSupportError(
                    f"func({self.step.module_name}.{self.step.func_name}) should use @handler, @predict or @evaluate decorator"
                )
    else:
        # TODO: support user custom class and function with arguments
        if issubclass(cls_, PipelineHandler):
            func_name = self._get_internal_func_name(self.step.func_name)
        else:
            func_name = self.step.func_name
        if hasattr(cls_, "__enter__") and hasattr(cls_, "__exit__"):
            with cls_() as instance:
                func = getattr(instance, func_name)
                if getattr(func, DecoratorInjectAttr.Evaluate, False):
                    self._run_in_pipeline_handler_cls(func, "evaluate")
                elif getattr(func, DecoratorInjectAttr.Predict, False):
                    self._run_in_pipeline_handler_cls(func, "predict")
                else:
                    if self.handler_args:
                        func(**{"handler_args": self.handler_args})
                    else:
                        func()
        else:
            func = getattr(cls_(), func_name)
            if getattr(func, DecoratorInjectAttr.Evaluate, False):
                self._run_in_pipeline_handler_cls(func, "evaluate")
            elif getattr(func, DecoratorInjectAttr.Predict, False):
                self._run_in_pipeline_handler_cls(func, "predict")
            else:
                if self.handler_args:
                    func(**{"handler_args": self.handler_args})
                else:
                    func()