Thanks for the informative article. I wanted to share that we usually use the concrete class abstraction in most modules. It is a good way to enforce convention over configuration. If the packages are proprietary, we ship the concrete abstract as ionCubed with license and they have the bulk of functionality, with final protected methods. Developers can extend but core functionality must remain..