class_docstr: Main class from which all Flows should inherit.
  
  Attributes
  ----------
  index
  input
code: def _validate_ubf_step(self, step_name):
      join_list = self._graph[step_name].out_funcs
      if len(join_list) != 1:
          msg = (
              "UnboundedForeach is supported only over a single node, "
              "not an arbitrary DAG. Specify a single `join` node"
              " instead of multiple:{join_list}.".format(
                  join_list=join_list
              )
          )
          raise InvalidNextException(msg)
      join_step = join_list[0]
      join_node = self._graph[join_step]
      join_type = join_node.type
  
      if join_type != "join":
          msg = (
              "UnboundedForeach found for:{node} -> {join}."
              " The join type isn't valid.".format(
                  node=step_name, join=join_step
              )
          )
          raise InvalidNextException(msg)
  
imports: import inspect
  import os
  import sys
  import traceback
  from itertools import islice
  from types import FunctionType, MethodType
  from typing import Any, Callable, List, Optional, Tuple
  from .None import cmd_with_io
  from .parameters import DelayedEvaluationParameter, Parameter
  from .exception import MetaflowException, MissingInMergeArtifactsException, UnhandledInMergeArtifactsException
  from .graph import FlowGraph
  from .unbounded_foreach import UnboundedForeachInput
  from .datastore.inputs import Inputs
label_desc: Use image node_id 14 for calling the FlowSpec obj's underlying member method code with example usage: obj._validate_ubf_step(step_name) without return types