Во фреймворке Qb, для которого мне понадобился валидатор, есть интересная фича. Мы регистрируем обработчик события статически:
фрагмент конфига:
array(
// …
'events' => array (
'onSomeEvent' => array (
array ('myComponent', 'doOnSomeEvent'),
// …
),
);
или динамически
Qb::attachEventHandler('onSomeEvent', array('myComponent', 'doOnSomeEvent'));
Здесь myComponent — имя компонента, который (возможно) ещё не был инстанциирован! Тем не менее событие будет обработано как ожидается. Потому, что в нужный момент обращение Qb::get('myComponent') выдаст инстанс объекта. Аналогично происходит в роутере — когда понадобится Контроллер, он будет создан. А нет — так нет.
Тот же фокус можно повторить для правил валидации с колбеками. Только чтобы переписать пример из ТС, понадобится добавить пару оффтопичных строк.
Не буду усложнять. Просто поверьте на слово :)