https://www.tinyash.com/blog/dependency-inversion-principle/