split up the the base class so implementers can define own value mappings