def METHOD_NAME(self, start: float = 1.0, end: float = 0.0, duration: int = 1000) -> None:
    if self.frozen:
        self.emit("animation-finished")
        return
    self._state = start
    self._start = start
    self._end = end
    self._duration = duration
    if self._source:
        GLib.source_remove(self._source)
    try:
        self._step_size = (end - start) / (self.fps * (duration / 1000.0))
    except ZeroDivisionError:
        self._state = end
        return
    self._state_changed(self._state)
    self._source = GLib.timeout_add(int(1.0 / self.fps * 1000), self._do_transition)