'This updates the undo position.
Args:
step (int, optional): The amount of steps
to progress the undo position to. This
may be a negative value for undo and
a positive value for redo.'

def update_undo(self, step=None):

    if (step and (step < 0)):
        if (self._undo_pos <= 0):
            self._caller.msg(_MSG_NO_UNDO)
        else:
            self._undo_pos = max(0, (self._undo_pos + step))
            self._buffer = self._undo_buffer[self._undo_pos]
            self._caller.msg(_MSG_UNDO)
    elif (step and (step > 0)):
        if ((self._undo_pos >= (len(self._undo_buffer) - 1)) or ((self._undo_pos + 1) >= self._undo_max)):
            self._caller.msg(_MSG_NO_REDO)
        else:
            self._undo_pos = min((self._undo_pos + step), (min(len(self._undo_buffer), self._undo_max) - 1))
            self._buffer = self._undo_buffer[self._undo_pos]
            self._caller.msg(_MSG_REDO)
    if ((not self._undo_buffer) or (self._undo_buffer and (self._buffer != self._undo_buffer[self._undo_pos]))):
        self._undo_buffer = (self._undo_buffer[:(self._undo_pos + 1)] + [self._buffer])
        self._undo_pos = (len(self._undo_buffer) - 1)
