code: def workflow_property(func):
      
      @functools.wraps(func)
      def wrapper(self):
          return func(self.as_workflow())
  
      return property(wrapper)
docs: Decorator to declare a property that is stored only on a workflow but makes it also accessible
      from branch tasks. Internally, branch tasks are re-instantiated with ``branch=-1``, and its
      decorated property is invoked. You might want to use this decorator in case of a property that
      is common (and mutable) to a workflow and all its branch tasks, e.g. for static data. Example:
  
      .. code-block:: python
  
          class MyTask(Workflow):
  
              def __init__(self, *args, **kwargs):
                  super(MyTask, self).__init__(*args, **kwargs)
  
                  if self.is_workflow():
                      self._common_data = some_demanding_computation()
  
              @workflow_property
              def common_data(self):
                  # this method is always called with *self* is the *workflow*
                  return self._common_data