code: def __call__(self, f: F) -> F:
      @functools.wraps(f)
      def _f(*args, **kwargs):
          obj_iter = itertools.chain(args, kwargs.values())
          if any(self.check(obj) for obj in obj_iter):
              f_name = f.__name__.replace("nan", "")
              raise TypeError(
                  f"reduction operation '{f_name}' not allowed for this dtype"
              )
          try:
              return f(*args, **kwargs)
          except ValueError as e:
              # we want to transform an object array
              # ValueError message to the more typical TypeError
              # e.g. this is normally a disallowed function on
              # object arrays that contain strings
              if is_object_dtype(args[0]):
                  raise TypeError(e) from e
              raise
  
      return cast(F, _f)
  
imports: from __future__ import annotations
  import functools
  import itertools
  from typing import Any, Callable, cast
  import warnings
  import numpy
  from pandas._config import get_option
  from pandas._libs import NaT, NaTType, iNaT, lib
  from pandas._typing import ArrayLike, AxisInt, CorrelationMethod, Dtype, DtypeObj, F, Scalar, Shape, npt
  from pandas.compat._optional import import_optional_dependency
  from pandas.util._exceptions import find_stack_level
  from pandas.core.dtypes.common import is_complex, is_float, is_float_dtype, is_integer, is_numeric_dtype, is_object_dtype, needs_i8_conversion, pandas_dtype
  from pandas.core.dtypes.missing import isna, na_value_for_dtype, notna
label_desc: Use image node_id 3 for calling the disallow obj's underlying member method code with example usage: obj.__call__(f) and returns: cast, f