https://techiworks.com/state-pattern/