bit of an experimental refactor because I wasn't feeling warm and fuzzy about the overall organisation of classes