this is asynchronous; shouldn't it take a callback?