/// <summary>
        /// Initializes a new instance of the <see cref="ComplexIdentifiableReferenceCore"/> class.
        /// </summary>
        /// <param name="id">
        /// The id. 
        /// </param>
        /// <param name="structureType">
        /// The structure type. 
        /// </param>
        /// <param name="annotationRef">
        /// The annotation ref. 
        /// </param> 
        /// <param name="nameRef">
        /// The name ref. 
        /// </param>
        /// <param name="descriptionRef">
        /// The description ref. 
        /// </param>
        /// <param name="childReference">
        /// The child reference. 
        /// </param> 
        public ComplexIdentifiableReferenceCore(IComplexTextReference id, SdmxStructureType structureType,
			IComplexAnnotationReference annotationRef, IComplexTextReference nameRef, IComplexTextReference descriptionRef,
			IComplexIdentifiableReferenceObject childReference) 
	    	: base(structureType, annotationRef, nameRef, descriptionRef)
	    {	
	        	this._id = id;
	        	this._childReference = childReference;
	    }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComplexStructureReferenceCore"/> class.
        /// </summary>
        /// <param name="agencyId">
        /// The agency id. 
        /// </param>
        /// <param name="id">
        /// The id. 
        /// </param>
        /// <param name="versionRef">
        /// The version ref. 
        /// </param>
        /// <param name="structureType">
        /// The structure type. 
        /// </param>
        /// <param name="annotationRef">
        /// The annotation ref. 
        /// </param>
        /// <param name="nameRef">
        /// The name ref. 
        /// </param>
        /// <param name="descriptionRef">
        /// The description ref. 
        /// </param>
        /// <param name="childRef">
        /// The child ref. 
        /// </param>
        public ComplexStructureReferenceCore(IComplexTextReference agencyId, IComplexTextReference id,
            IComplexVersionReference versionRef, SdmxStructureType structureType, IComplexAnnotationReference annotationRef,
			IComplexTextReference nameRef, IComplexTextReference descriptionRef, IComplexIdentifiableReferenceObject childRef) 
		: base(structureType, annotationRef, nameRef, descriptionRef)
		{
		this._id = id;
		this._agencyId = agencyId;
		this._versionRef = versionRef;
		//TODO childRef defaults && null check...
		this._childRef = childRef;
	    }
        /**
         * builds a complex structure reference from XML beans values.
         * @param maintainableWhere
         * @param childRef if items in the where clauses (for ItemSchemes) otherwise null
         * @return
         */
        private IComplexStructureReferenceObject BuildMaintainableWhere(MaintainableWhereType maintainableWhere, IComplexIdentifiableReferenceObject childRef)
        {
            QueryNestedIDType agencyIDType = maintainableWhere.AgencyID;
            IComplexTextReference agencyId = null;
            if (agencyIDType != null)
            {
                agencyId = BuildTextReference(null, [email protected](), agencyIDType.TypedValue);
            }

            QueryIDType queryIDType = maintainableWhere.ID;
            IComplexTextReference id = null;
            if (queryIDType != null)
            {
                id = BuildTextReference(null, [email protected](), queryIDType.TypedValue.ToString());
            }

            IComplexVersionReference versionRef = BuildVersionReference(maintainableWhere.Version != null ? maintainableWhere.Version.ToString() : null, maintainableWhere.VersionFrom, maintainableWhere.VersionTo);

            SdmxStructureType structureType;
            if (maintainableWhere.type.Equals("OrganisationScheme"))
            { // hack. This checked are done since it is not identifiable no element name in enum and cannot use parseClass()
                structureType = SdmxStructureType.GetFromEnum(SdmxStructureEnumType.OrganisationScheme);
            }
            else if (maintainableWhere.type.Equals("Constraint"))
            {
                structureType = SdmxStructureType.GetFromEnum(SdmxStructureEnumType.ContentConstraint);
            }
            else if (maintainableWhere.type.Equals("Any"))
            {
                structureType = SdmxStructureType.GetFromEnum(SdmxStructureEnumType.Any);
            }
            else
            {
                structureType = SdmxStructureType.ParseClass(maintainableWhere.type);
            }

            IComplexAnnotationReference annotationRef = BuildAnnotationReference(maintainableWhere.Annotation);

            QueryTextType nameType = maintainableWhere.Name;
            IComplexTextReference nameRef = null;
            if (nameType != null)
            {
                nameRef = BuildTextReference(nameType.lang, [email protected](), nameType.TypedValue.ToString());
            }


            QueryTextType descriptionType = maintainableWhere.Description;
            IComplexTextReference descriptionRef = null;
            if (descriptionType != null)
            {
                descriptionRef = BuildTextReference(descriptionType.lang, [email protected](), descriptionType.TypedValue.ToString());
            }


            return new ComplexStructureReferenceCore(agencyId, id, versionRef, structureType, annotationRef, nameRef, descriptionRef, childRef);
        }