Add a column to the source table.
        :param position: Integer position of the column started from 1.
        :param source_header: Name of the column, as it exists in the source file
        :param datatype: Python datatype ( str, int, float, None ) for the column
        :param kwargs:  Other source record args.
        :return:

def add_column(self, position, source_header, datatype, **kwargs):
        """
        Add a column to the source table.
        :param position: Integer position of the column started from 1.
        :param source_header: Name of the column, as it exists in the source file
        :param datatype: Python datatype ( str, int, float, None ) for the column
        :param kwargs:  Other source record args.
        :return:
        """
        from ..identity import GeneralNumber2

        c = self.column(source_header)
        c_by_pos = self.column(position)

        datatype = 'str' if datatype == 'unicode' else datatype

        assert not c or not c_by_pos or c.vid == c_by_pos.vid

        # Convert almost anything to True / False
        if 'has_codes' in kwargs:
            FALSE_VALUES = ['False', 'false', 'F', 'f', '', None, 0, '0']
            kwargs['has_codes'] = False if kwargs['has_codes'] in FALSE_VALUES else True

        if c:

            # Changing the position can result in conflicts
            assert not c_by_pos or c_by_pos.vid == c.vid

            c.update(
                position=position,
                datatype=datatype.__name__ if isinstance(datatype, type) else datatype,
                **kwargs)

        elif c_by_pos:

            # FIXME This feels wrong; there probably should not be any changes to the both
            # of the table, since then it won't represent the previouls source. Maybe all of the sources
            # should get their own tables initially, then affterward the duplicates can be removed.

            assert not c or c_by_pos.vid == c.vid

            c_by_pos.update(
                source_header=source_header,
                datatype=datatype.__name__ if isinstance(datatype, type) else datatype,
                **kwargs)

        else:

            assert not c and not c_by_pos

            # Hacking an id number, since I don't want to create a new Identity ObjectNUmber type
            c = SourceColumn(
                vid=str(GeneralNumber2('C', self.d_vid, self.sequence_id, int(position))),
                position=position,
                st_vid=self.vid,
                d_vid=self.d_vid,
                datatype=datatype.__name__ if isinstance(datatype, type) else datatype,
                source_header=source_header,
                **kwargs)

            self.columns.append(c)

        return c