code: def run_interceptors(  # pylint: disable=invalid-name
      bound_method: Callable[..., Any],
      method_name: str,
      self: "Module",
      orig_class: type["Module"],
      *args: Args,
      **kwargs: Kwargs,
  ) -> Any:
      """Runs any method interceptors or the original method."""
      if not interceptor_stack:
          return bound_method(*args, **kwargs)
  
      ctx = MethodContext(
          module=self,
          method_name=method_name,
          orig_method=bound_method,
          orig_class=orig_class,
      )
      interceptor_stack_copy = interceptor_stack.clone()
  
      def next_fun(*args, **kwargs):
          if interceptor_stack_copy:
              # NOTE: The `interceptor_fun` may call `next_fun` to trigger the next
              # interceptor (and so on) allowing interceptors to be run in turn.
              interceptor_fun = interceptor_stack_copy.popleft()
              return interceptor_fun(next_fun, args, kwargs, ctx)
          else:
              return bound_method(*args, **kwargs)
  
      return next_fun(*args, **kwargs)
  
imports: from collections.abc import Mapping
  import contextlib
  import functools
  import inspect
  import re
  from typing import Any, Callable, ContextManager, NamedTuple, Optional, Protocol, TypeVar
  from haiku._src import base
  from haiku._src import config
  from haiku._src import data_structures
  from haiku._src import utils
  import jax
  import jax.numpy
label_desc: Use image node_id 3 for calling a global function with example usage: run_interceptors(bound_method, method_name, orig_class) and returns: next_fun, bound_method, interceptor_fun, bound_method