def METHOD_NAME(self) -> dict:
    output_spec = self._outputs()
    assert output_spec is not None
    outputs = output_spec.get()
    row_index = self.inputs.row_index
    use_index = isdefined(row_index) and row_index is True
    if self._numinputs < 1:
        return outputs
    data_frames: list[pd.DataFrame] = list()
    for i in range(self._numinputs):
        file_paths = getattr(self.inputs, "in%d" % (i + 1))
        column_names = getattr(self.inputs, "column_names%d" % (i + 1))
        if not isdefined(file_paths):
            continue
        if isinstance(file_paths, str):
            file_paths = [file_paths]
        file_paths = ravel(file_paths)
        for file_path in file_paths:
            data_frame = read_spreadsheet(file_path)
            if data_frame.size == 0:
                continue
            if isdefined(column_names):
                if not isinstance(column_names, (list, tuple)):
                    column_names = [column_names]
                data_frame = data_frame.set_axis(
                    column_names, axis="columns", copy=False
                )
            data_frames.append(data_frame)
    if len(data_frames) == 0:
        data_frame = pd.DataFrame()
    else:
        data_frame = pd.concat(data_frames, axis=1)
    if isinstance(row_index, list):
        if len(row_index) == len(data_frame.index):
            use_index = True
            data_frame.index = self.inputs.row_index
    out_with_header = Path.cwd() / "merge_with_header.tsv"
    out_no_header = Path.cwd() / "merge_no_header.tsv"
    kwargs = dict(sep="\t", na_rep="n/a")
    data_frame.to_csv(out_with_header, index=use_index, header=True, **kwargs)
    data_frame.to_csv(out_no_header, index=False, header=False, **kwargs)
    outputs["out_with_header"] = out_with_header
    outputs["out_no_header"] = out_no_header
    outputs["column_names"] = list(map(str, data_frame.columns))
    return outputs