https://medium.com/pragmatic-programmers/2-3-flexible-initialization-and-named-arguments-d5bf0dcf4254