It just came to my mind: did you consider making the tag an abstract value member? This way users would not have really know about the tag or propagate it manually (especially through possible inheritance chains), which would mean less boiler plate. The only thing they would need to do is make their classes abstract, which actually makes sense as they are not supposed to instantiate them. WDYT?