type
A = ref object of RootObj
AA = ref object of A
BB = ref object of A
CC = ref object of A
E = ref object of RootObj
field: A
method doSmt(a: A, i: int): iterator() = return iterator() = echo "A" & repr(i)
method doSmt(a: AA, i: int): iterator() = return iterator() = echo "AA" & repr(i)
method doSmt(a: BB, i: int): iterator() = return iterator() = echo "BB" & repr(i)
method doSmt(a: CC, i: int): iterator() = return iterator() = echo "CC" & repr(i)
let a: A = AA()
a.doSmt(1)()
let e: E = E(field: BB())
e.field.doSmt(2)()
dHlwZQogIEEgPSByZWYgb2JqZWN0IG9mIFJvb3RPYmoKICBBQSA9IHJlZiBvYmplY3Qgb2YgQQogIEJCID0gcmVmIG9iamVjdCBvZiBBCiAgQ0MgPSByZWYgb2JqZWN0IG9mIEEKICBFID0gcmVmIG9iamVjdCBvZiBSb290T2JqCiAgICBmaWVsZDogQQogIAptZXRob2QgZG9TbXQoYTogQSwgaTogaW50KTogaXRlcmF0b3IoKSA9IHJldHVybiBpdGVyYXRvcigpID0gZWNobyAiQSIgJiByZXByKGkpCm1ldGhvZCBkb1NtdChhOiBBQSwgaTogaW50KTogaXRlcmF0b3IoKSA9IHJldHVybiBpdGVyYXRvcigpID0gZWNobyAiQUEiICYgcmVwcihpKQptZXRob2QgZG9TbXQoYTogQkIsIGk6IGludCk6IGl0ZXJhdG9yKCkgPSByZXR1cm4gaXRlcmF0b3IoKSA9IGVjaG8gIkJCIiAmIHJlcHIoaSkKbWV0aG9kIGRvU210KGE6IENDLCBpOiBpbnQpOiBpdGVyYXRvcigpID0gcmV0dXJuIGl0ZXJhdG9yKCkgPSBlY2hvICJDQyIgJiByZXByKGkpCgpsZXQgYTogQSA9IEFBKCkKYS5kb1NtdCgxKSgpCgpsZXQgZTogRSA9IEUoZmllbGQ6IEJCKCkpCmUuZmllbGQuZG9TbXQoMikoKQ==