I hate writing abstraction code like this, but I'm hoping it will be useful.
This is just the beginning.