use vararg style API, callback must be at the end