Разрабатываю для одного не очень гибкого фреймворка функционал т. н. «плагинов». Описывать функционал целиком не буду, сразу конкретизирую проблему.
Примитивная схема. Есть класс Component (ядро фреймворка). Есть трейт PluginTrat (мой трейт, могу писать всё что угодно), который подключается в компоненте:
class Component
{
use PluginTrait;
function executeComponent()
{
…
}
}
trait PluginTrait
{
…
}
Мне нужно в трейте, не переназначая метод executeComponent(), внедриться в класс компонента и вызвать до и после выполнения метода executeComponent() свои методы трейта. Т. е. шаги выполнения класса компонента должны быть такими:
1. методТрейта1.
2. метод компонента executeComponent() (ну он и так сам будет выполняться).
3. методТрейта2.
Проблема заключается в том, что класс Component — это ядро фреймворка, и по определённым соображениям менять (внедряться) я его не могу. Кроме того, нужно учитывать, что цепочка наследования класса может быть увеличена, и в дочерних классах появится свой метод executeComponent() (его присутствие не должно нарушать порядок выполнения класса, описанный выше).