type K = enum
ka,kb
type A = object
case kind: K
of ka: adata:int
of kb: bdata:string
proc a():A = A(kind:ka)
var an = a()
proc `data=`[T:int|string](m:var A,val:T) =
when T is int:
if m.kind != ka:
m.reset
m.kind = ka
m.adata = val
elif T is string:
if m.kind != kb:
m.reset
m.kind = kb
m.bdata = val
an.data = 5
echo an.kind, an.adata
an.data = "hello"
echo an.kind, an.bdata