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"])