code: def __call__(self, fn):
      def wrapped_fn(*args, **kwargs):
          self._set_decorator_params()
          fn_callable = functools.partial(fn, *args, **kwargs)
          if self.tool == "timeit":
              return profile_timeit(fn_callable, **self.tool_cfg)
          elif self.tool == "cprofile":
              prof_file = os.path.join(
                  PROF_DIR, self.fn_id(*args, **kwargs)
              )
              return profile_cprofile(fn_callable, prof_file=prof_file)
          else:
              raise ValueError(
                  "Invalid profiling tool specified: {}.".format(
                      self.tool
                  )
              )
  
      return wrapped_fn
  
imports: import cProfile
  import functools
  import os
  import pstats
  import timeit
  from contextlib import contextmanager
  from io import StringIO
  from prettytable import ALL, PrettyTable
label_desc: Use image node_id 3 for calling the Profile obj's underlying member method code with example usage: obj.__call__(fn) and returns: wrapped_fn, profile_timeit, profile_cprofile