Abstract hook pattern