Perhaps this should be a concrete class, like we did with RunListener?