shouldn't the following 3 classes be implementation details and thus not exposed in the public header?