internal structure shouldn't be touched from a client