abstraction is a good thing