make overall completion callback optional