class_docstr: Core :py:class:`.PluginManager` class which manages registration
  of plugin objects and 1:N hook calling.
  
  You can register new hooks by calling :py:meth:`add_hookspecs(module_or_class)
  <.PluginManager.add_hookspecs>`.
  You can register plugin objects (which contain hooks) by calling
  :py:meth:`register(plugin) <.PluginManager.register>`.  The :py:class:`.PluginManager`
  is initialized with a prefix that is searched for in the names of the dict
  of registered plugin objects.
  
  For debugging purposes you can call :py:meth:`.PluginManager.enable_tracing`
  which will subsequently send debug information to the trace helper.
code: def parse_hookimpl_opts(self, plugin, name):
      method = getattr(plugin, name)
      if not inspect.isroutine(method):
          return
      try:
          res = getattr(method, self.project_name + "_impl", None)
      except Exception:
          res = {}
      if res is not None and not isinstance(res, dict):
          # false positive
          res = None
      # TODO: remove when we drop implprefix in 1.0
      elif (
          res is None
          and self._implprefix
          and name.startswith(self._implprefix)
      ):
          _warn_for_function(
              DeprecationWarning(
                  "The `implprefix` system is deprecated please decorate "
                  "this function using an instance of HookimplMarker."
              ),
              method,
          )
          res = {}
      return res
  
imports: import inspect
  import sys
  from .None import _tracing
  from .callers import _Result
  from .hooks import HookImpl, _HookRelay, _HookCaller, normalize_hookimpl_opts
  import warnings
label_desc: Use image node_id 4 for calling the PluginManager obj's underlying member method code with example usage: obj.parse_hookimpl_opts(plugin, name) and returns: res