more powerful transitions, but uses eval