https://medium.com/@boutaleb.hm/understanding-the-observer-design-pattern-examples-and-implementation-6cf283f71aa0