Completed Chapter 8

Split out responsibilities into a new class and removed some code
smell.

Also updated the bin to allow the application to be ran and the
new functionality tested.