Break out the hook implementations into three kinds, thus avoiding null macro arguments. Gates made me do it!