Refactor similarities of base, projection, and extension into base class