Add a promise-based version