a variant / discriminated union class