unified callback style