Refactored API: cb is always as first argument after self