Abstracted behaviour into separate classes. This still needs some work.