Refactor runner to use callback