(0) Используй "Функциональные опции". Если не злоупотреблять (не создавать много вариаций для Интерфейса), то можно прятать даже интерфейс подсистем не качаясь "Ролей" :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший