class_docstr: Core class which manages registration of plugin objects and 1:N hook
  calling.
  
  You can register new hooks by calling :meth:`add_hookspecs(module_or_class)
  <PluginManager.add_hookspecs>`.
  
  You can register plugin objects (which contain hook implementations) by
  calling :meth:`register(plugin) <PluginManager.register>`.
  
  For debugging purposes you can call :meth:`PluginManager.enable_tracing`
  which will subsequently send debug information to the trace helper.
  
  :param project_name:
      The short project name. Prefer snake case. Make sure it's unique!
docstr: Try to obtain a hook implementation from an item with the given name
  in the given plugin which is being searched for hook impls.
  
  :returns:
      The parsed hookimpl options, or None to skip the given item.
  
  This method can be overridden by ``PluginManager`` subclasses to
  customize how hook implementation are picked up. By default, returns the
  options for items decorated with :class:`HookimplMarker`.
docstr_tok: ["Try","to","obtain","a","hook","implementation","from","an","item","with","the","given","name","in","the","given","plugin","which","is","being","searched","for","hook","impls",".",":","returns",":","The","parsed","hookimpl","options",",","or","None","to","skip","the","given","item",".","This","method","can","be","overridden","by","``","PluginManager","``","subclasses","to","customize","how","hook","implementation","are","picked","up",".","By","default",",","returns","the","options","for","items","decorated","with",":","class",":","`","HookimplMarker","`","."]
code: def parse_hookimpl_opts(
      self, plugin: _Plugin, name: str
  ) -> HookimplOpts | None:
      """Try to obtain a hook implementation from an item with the given name
      in the given plugin which is being searched for hook impls.
  
      :returns:
          The parsed hookimpl options, or None to skip the given item.
  
      This method can be overridden by ``PluginManager`` subclasses to
      customize how hook implementation are picked up. By default, returns the
      options for items decorated with :class:`HookimplMarker`.
      """
      method: object = getattr(plugin, name)
      if not inspect.isroutine(method):
          return None
      try:
          res: HookimplOpts | None = getattr(
              method, self.project_name + "_impl", None
          )
      except Exception:
          res = {}  # type: ignore[assignment]
      if res is not None and not isinstance(res, dict):
          # false positive
          res = None  # type:ignore[unreachable]
      return res
  
imports: from __future__ import annotations
  import importlib.metadata
  import inspect
  import types
  import warnings
  from typing import Any
  from typing import Callable
  from typing import cast
  from typing import Final
  from typing import Iterable
  from typing import Mapping
  from typing import Sequence
  from .None import _tracing
  from ._callers import _multicall
  from ._hooks import _HookImplFunction
  from ._hooks import _Namespace
  from ._hooks import _Plugin
  from ._hooks import _SubsetHookCaller
  from ._hooks import HookCaller
  from ._hooks import HookImpl
  from ._hooks import HookimplOpts
  from ._hooks import HookRelay
  from ._hooks import HookspecOpts
  from ._hooks import normalize_hookimpl_opts
  from ._result import Result
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, None