put client work in its own class to avoid sharing things like input