first pass of things working, still some abstraction remaining