docs: def _new(self, dx_hash, **kwargs):
          """
          :param dx_hash: Standard hash populated in :func:`dxpy.bindings.DXDataObject.new()` containing attributes common to all data object classes.
          :type dx_hash: dict
          :param title: Workflow title (optional)
          :type title: string
          :param summary: Workflow summary (optional)
          :type summary: string
          :param description: Workflow description (optional)
          :type description: string
          :param output_folder: Default output folder of the workflow (optional)
          :type output_folder: string
          :param stages: Stages of the workflow (optional)
          :type stages: array of dictionaries
          :param workflow_inputs: Workflow-level input specification (optional)
          :type workflow_inputs: array of dictionaries
          :param workflow_outputs: Workflow-level output specification (optional)
          :type workflow_outputs: array of dictionaries
          :param init_from: Another analysis workflow object handler or and analysis (string or handler) from which to initialize the metadata (optional)
          :type init_from: :class:`~dxpy.bindings.dxworkflow.DXWorkflow`, :class:`~dxpy.bindings.dxanalysis.DXAnalysis`, or string (for analysis IDs only)
  
          Create a new remote workflow object.
          """
  
          def _set_dx_hash(kwargs, dxhash, key, new_key=None):
              new_key = key if new_key is None else new_key
              if key in kwargs:
                  if kwargs[key] is not None:
                      dxhash[new_key] = kwargs[key]
                  del kwargs[key]
  
          if "init_from" in kwargs:
              if kwargs["init_from"] is not None:
                  if not (isinstance(kwargs["init_from"], (DXWorkflow, DXAnalysis)) or \
                          (isinstance(kwargs["init_from"], basestring) and \
                           re.compile('^analysis-[0-9A-Za-z]{24}$').match(kwargs["init_from"]))):
                      raise DXError("Expected init_from to be an instance of DXWorkflow or DXAnalysis, or to be a string analysis ID.")
                  if isinstance(kwargs["init_from"], basestring):
                      dx_hash["initializeFrom"] = {"id": kwargs["init_from"]}
                  else:
                      dx_hash["initializeFrom"] = {"id": kwargs["init_from"].get_id()}
                      if isinstance(kwargs["init_from"], DXWorkflow):
                          dx_hash["initializeFrom"]["project"] = kwargs["init_from"].get_proj_id()
              del kwargs["init_from"]
  
          _set_dx_hash(kwargs, dx_hash, "title")
          _set_dx_hash(kwargs, dx_hash, "summary")
          _set_dx_hash(kwargs, dx_hash, "description")
          _set_dx_hash(kwargs, dx_hash, "output_folder", "outputFolder")
          _set_dx_hash(kwargs, dx_hash, "stages")
          _set_dx_hash(kwargs, dx_hash, "workflow_inputs", "inputs")
          _set_dx_hash(kwargs, dx_hash, "workflow_outputs", "outputs")
  
          resp = dxpy.api.workflow_new(dx_hash, **kwargs)
          self.set_ids(resp["id"], dx_hash["project"])