https://medium.com/cp-massive-programming/useful-patterns-every-developer-should-know-part-1-1425656c491a