code: def register_work_from_cbk(self, cbk_name, cbk_data, deps, work_class, manager=None):
          
          # TODO: pass a Work factory instead of a class
          # Directory of the Work.
          work_workdir = os.path.join(self.workdir, "w" + str(len(self)))
  
          # Create an empty work and register the callback
          work = work_class(workdir=work_workdir, manager=manager)
  
          self._works.append(work)
  
          deps = [Dependency(node, exts) for node, exts in deps.items()]
          if not deps:
              raise ValueError("A callback must have deps!")
  
          work.add_deps(deps)
  
          # Wrap the callable in a Callback object and save
          # useful info such as the index of the work and the callback data.
          cbk = FlowCallback(cbk_name, self, deps=deps, cbk_data=cbk_data)
          self._callbacks.append(cbk)
  
          return work
docs: Registers a callback function that will generate the :class:`Task` of the :class:`Work`.
  
          Args:
              cbk_name: Name of the callback function (must be a bound method of self)
              cbk_data: Additional data passed to the callback function.
              deps: List of :class:`Dependency` objects specifying the dependency of the work.
              work_class: :class:`Work` class to instantiate.
              manager: The :class:`TaskManager` responsible for the submission of the task.
                      If manager is None, we use the `TaskManager` specified during the creation of the :class:`Flow`.
  
          Returns:
              The :class:`Work` that will be finalized by the callback.