code: def subscribe(self, _func=None, needs=(), returns=(), modifies=(),
              **conditions):
          
  
          modifies = set(modifies)
          parameters = set(needs) | modifies
          needs = parameters | set(conditions)
          if not needs:
              raise ValueError("tried to hook nothing")
          returns = set(returns) | modifies
          def deco(func):
              self.hooks.append(_Hook(
                  func, needs, parameters, returns, conditions))
              return func
  
          # If we were passed a function as a positional parameter, then we
          # shouldn't behave like a decorator.
          if _func is not None:
              deco(_func)
          else:
              return deco
docs: Add a hook to a pangler.
  
          This method can either be used as a decorator for a function or method,
          or standalone on a callable.
  
           * `needs` is an iterable of parameters that this hook operates on.
           * `returns` is an iterable of parameters that this hook will modify
             and then pass back to the pangler.
           * `modifies` is a convenient way to specify that this hook both needs
             and returns a parameter.
           * The rest of the keyword arguments are parameter predicates.