code: def call_hook_recursive(self, name, **kwargs):
          
          for x, _ in self._hooks.get(name, []):
              out = x(**kwargs)
              if out is not None: #ignore already reported failure
                  kwargs = out
          return kwargs
docs: Call all hooks registered with this name. Each hook receives as arguments the return value of the
              previous hook call, or the initial params for the first hook. As such, each hook must return a dictionary
              with the received (eventually modified) args. Returns the modified args.