why do we need to do all this rather than just use token equality?