По поводу передачи параметров по ссылке - если смущает запоминание порядка передачи, то можно передавать ассоциативный массив, значения в котором будут записаны по ссылке типа такого:
$filter -> fire(array('arg1' => &$arg1, 'arg2' => &$arg2));
А собственно сам механизм легко реализовать - сделать, скажем, класс, который хранит все события и дает возможность регистрации этих событий и их слушателей. Только нужно четко соблюдать зависимости в таком случае, то есть чтобы не возникло такой ситуации, когда сначала событие выполняется, а потом на него подписываются слушатели.