these functions are internal and don't need to be documented