/// <summary></summary>
        /// <param name="refKind">The kind of variable we're this reference</param>
        /// <param name="refMemberName">The variable's reference type</param>
        /// <param name="dataValue">Actual 'data' value for the variable reference</param>
        /// <param name="dataTypeName">Optional type info for <paramref name="dataValue"/></param>
        /// <returns></returns>
        public MegaloScriptVariableReferenceData NewVarReference(MegaloScriptVariableReferenceType refKind,
                                                                 string refMemberName, int dataValue = TypeExtensions.kNone,
                                                                 string dataTypeName = null)
        {
            Contract.Requires(!string.IsNullOrEmpty(refMemberName));

            MegaloScriptVariableReferenceData result;

            Proto.MegaloScriptProtoVariableReferenceMember member;
            MegaloScriptVariableReferenceData.Initialize(this,
                                                         out result, refKind, out member, refMemberName, dataTypeName);

            result.Data = dataValue;

            return(result);
        }
        /// <summary></summary>
        /// <param name="refKind">The kind of variable we're this reference</param>
        /// <param name="refMemberName">The variable's reference type</param>
        /// <param name="indexName">Actual 'data' value for the variable reference</param>
        /// <param name="dataTypeName">Optional type info for <paramref name="indexName"/></param>
        /// <returns></returns>
        public MegaloScriptVariableReferenceData NewVarReferenceWithIndexData(MegaloScriptVariableReferenceType refKind,
                                                                              string refMemberName, string indexName,
                                                                              string dataTypeName = null)
        {
            Contract.Requires(!string.IsNullOrEmpty(refMemberName));
            Contract.Requires(indexName != null);

            MegaloScriptVariableReferenceData result;

            Proto.MegaloScriptProtoVariableReferenceMember member;
            MegaloScriptVariableReferenceData.Initialize(this,
                                                         out result, refKind, out member, refMemberName, dataTypeName);

            Contract.Assert(member.HasDataValue, "Member has no data field, let alone index data");

            result.Data = GetTargetIndexFromName(member.ValueType.IndexTarget, indexName);

            return(result);
        }
        /// <summary></summary>
        /// <param name="refKind">The kind of variable we're this reference</param>
        /// <param name="refMemberName">The variable's reference type</param>
        /// <param name="enumMemberName">Actual 'data' value for the variable reference</param>
        /// <param name="dataTypeName">Optional type info for <paramref name="enumMemberName"/></param>
        /// <returns></returns>
        public MegaloScriptVariableReferenceData NewVarReferenceWithEnumData(MegaloScriptVariableReferenceType refKind,
                                                                             string refMemberName, string enumMemberName,
                                                                             string dataTypeName = null)
        {
            Contract.Requires(!string.IsNullOrEmpty(refMemberName));
            Contract.Requires(!string.IsNullOrEmpty(enumMemberName));

            MegaloScriptVariableReferenceData result;

            Proto.MegaloScriptProtoVariableReferenceMember member;
            MegaloScriptVariableReferenceData.Initialize(this,
                                                         out result, refKind, out member, refMemberName, dataTypeName);

            Contract.Assert(member.HasDataValue, "Member has no data field, let alone enum data");

            var id_resolving_ctxt = new Proto.MegaloScriptEnum.EnumNameResolvingContext(Database, member.EnumValueType);

            result.Data = Proto.MegaloScriptEnum.EnumNameResolvingContext.IdResolver(id_resolving_ctxt, enumMemberName);

            return(result);
        }