{.experimental.}
type K = enum
ka,kb
type A = object
case kind: K
of ka: innerAdata:int
of kb: innerBdata:string
proc a():A = A(kind:ka)
var an = a()
proc `.=`[T](m:var A, field:string, val:T) =
echo "Dot operator assignment overload called!", field
if field == "adata":
if m.kind != ka:
m.reset
m.kind = ka
m.innerAdata = val
elif field == "bdata":
if m.kind != kb:
m.reset
m.kind = kb
m.innerBdata = val # this branch conflicts with the above branch, the type cant be both int and string
proc adata(m:A): int =
result = m.innerAdata
proc bdata(m:A): int =
result = m.innerAdata
an.adata = 5
echo an.kind, an.adata
an.adata = 6
echo an.kind, an.adata
an.bdata = "hello"
echo an.kind, an.bdata