code: def add_enumerable_node(
      self,
      node: type[Node],
      figtype: str,
      title_getter: TitleGetter | None = None,
      override: bool = False,
  ) -> None:
      logger.debug(
          "[app] adding enumerable node: (%r, %r, %r)",
          node,
          figtype,
          title_getter,
      )
      if node in self.enumerable_nodes and not override:
          raise ExtensionError(
              __("enumerable_node %r already registered") % node
          )
      self.enumerable_nodes[node] = (figtype, title_getter)
  
imports: from __future__ import annotations
  import sys
  import traceback
  from importlib import import_module
  from types import MethodType
  from typing import TYPE_CHECKING, Any, Callable
  from sphinx.domains import Domain, Index, ObjType
  from sphinx.domains.std import GenericObject, Target
  from sphinx.errors import ExtensionError, SphinxError, VersionRequirementError
  from sphinx.extension import Extension
  from sphinx.io import create_publisher
  from sphinx.locale import __
  from sphinx.parsers import Parser
  from sphinx.roles import XRefRole
  from sphinx.util import logging
  from sphinx.util.logging import prefixed_warnings
label_desc: Use image node_id 32 for calling the SphinxComponentRegistry obj's underlying member method code with example usage: obj.add_enumerable_node(node, figtype, title_getter, override) without return types