abstracting progress, step 1
step 2
step 3
cleanup
it's a little ugly on the lib side, but the API is good