a shitty 2d-canvas abstraction