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.

def call_hook_recursive(self, name, **kwargs):
        """ 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."""
        for x, _ in self._hooks.get(name, []):
            out = x(**kwargs)
            if out is not None: #ignore already reported failure
                kwargs = out
        return kwargs