I made this RFC: https://phabricator.wikimedia.org/T240307
TL;DR: we'll have one interface per hook, and that interface will be used for both calling and handling the hook.
It may seem like overkill, but on closer analysis, it actually seems to work pretty nicely. There will be a place for doc comments, arguments will be type-hinted, and smart code editors will be able to show the hook documentation when you call or handle it.
The main open questions are:
* Where to put the many core interfaces: together or grouped by module? * Should we split up the core HookRunner class by module? It contains one line of boilerplate code per hook.
Existing hook handling classes in extensions can be converted to the proposed system by:
* Changing all the handlers from static to non-static functions. * Adding the necessary "implements" clause. * Renaming any methods that do not already match the onHookName() pattern. * Tweaking extension.json slightly.
I'm going on vacation soon, so I'll be aiming to move this to last call early in the new year.
-- Tim Starling