docs: def add_hook(self, name, function):
          """
          Adds a function to be called for hook of a given name.
  
          The function gets entire workspace as input and
          does not return anything.
  
          Example:
          def hook_fcn(workspace):
              pass
          """
          if not callable(function):
              return ValueError('Hook function should be callable')
          if name not in self.hooks:
              self.hooks[name] = []
          self.hooks[name].append(function)
          return self