
struct Player {
    Animated<sf::Vector2> position;
    Animated<float> radius;
    Animated<cf::Color> color;

    void tick(int deltaTime) {
        position.tick(deltaTime);
        radius.tick(deltaTime);
        color.tick(deltaTime);
    }
};

template <typename T>
Animation<T> *moveBy(const T &initial, const T &delta)
{
    return new LinearAnimation(initial, initial + delta);
}

template <typename T>
Animation<T> *moveTo(const T &initial, const T &final)
{
    return new LinearAnimation(initial, final);
}


Player player;

player.position.animate(moveBy(player.position.value(), sf::Vector2(50.0f, 0.0f)))
player.radius.animate(moveTo(75.0f, 50.0f));
player.color.animate(moveTo(RED_COLOR, WHITE_COLOR));

while(...) {
    deltaTime = ...;
    player.tick(deltaTime)
}