use hash instead of arrays for callback storage

Also yields params instead of calling a block