if you have boilerplate then you're pretty much doing abstraction wrong