when a function is null, don't wrap it, so that the exception from calling it is more self-explanatory
try to name callbacks
rewrote tests with tap
note to self