never throw in async code paths (it will do bad things to the stack) please pass this into the callback as its first argument.