if we don't do error checking, I don't even need the callbacks