Refactor

Starts to move logic into interfaces so that we can be super dry.