there's no good reason for this to be a class