Could it be about the definition of OOP? It seems to me it depends on whether you consider inheritance being required to do OOP.
I found doing OOP with too much use of inheritance led to horribly confusing and possibly unoptimal code. Contain&delegate seems cleaner even at the cost of little bit of boilerplate.