public object Read(object value, ProtoReader source)
        {
            // TODO what may happen if old value is already existing reference? do we need to consider it?
            var v = _subTypeHelpers.TryRead(_model[_typeKey], value?.GetType(), source);

            if (v != null)
            {
                value = v.Serializer.CreateInstance(source);
            }
            else if (value != null)
            {
                ProtoReader.NoteObject(value, source);
            }
            else
            {
                throw new ProtoException(CantCreateInstanceMessage);
            }
            // each CreateInstance notes object
            ProtoReader.NoteLateReference(_baseTypeKey, value, source);
            return(value);
        }