engines just have to provide their own IO