helper functions are now private