monitor callback is now its own class because need to keep more state around