move the pure stuff to another class to make the separation clearer