protected virtual RESOURCE_DESCRIPTION CloneDescription(openehr.openehr.rm.common.resource.RESOURCE_DESCRIPTION o)
        {
            RESOURCE_DESCRIPTION result = new RESOURCE_DESCRIPTION();

            result.original_author = CloneHashTableAny(o.original_author());

            if (o.other_contributors() != null && o.other_contributors().count() > 0)
            {
                result.other_contributors = new string[o.other_contributors().count()];

                for (int i = 1; i < result.other_contributors.Length; i++)
                    result.other_contributors[i - 1] = (([email protected]_8)o.other_contributors().i_th(i)).to_cil();
            }

            result.lifecycle_state = o.lifecycle_state().to_cil();

            if (o.resource_package_uri() != null)
                result.resource_package_uri = o.resource_package_uri().ToString();

            result.other_details = CloneHashTableAny(o.other_details());

            // 0..1 parent_resource AUTHORED_RESOURCE (does not occur in NHS archetypes, do later)
            //if (o.parent_resource() != null)
            //result.parent_resource = CloneAuthoredResource(o.parent_resource());            

            if (o.details().count() > 0)
            {
                RESOURCE_DESCRIPTION_ITEM[] details = new RESOURCE_DESCRIPTION_ITEM[o.details().count()];
                o.details().start();

                for (int i = 1; i <= o.details().count(); i++)
                {
                    openehr.openehr.rm.common.resource.Impl.RESOURCE_DESCRIPTION_ITEM item = o.details().item_for_iteration() as openehr.openehr.rm.common.resource.Impl.RESOURCE_DESCRIPTION_ITEM;
                    details[i - 1] = new RESOURCE_DESCRIPTION_ITEM();
                    details[i - 1].language = CloneCodePhrase(item.language());

                    if (item.purpose() != null)
                        details[i - 1].purpose = item.purpose().ToString();

                    if (item.use() != null)
                        details[i - 1].use = item.use().ToString();

                    if (item.misuse() != null)
                        details[i - 1].misuse = item.misuse().ToString();

                    if (item.copyright() != null)
                        details[i - 1].copyright = item.copyright().ToString();

                    if (item.original_resource_uri() != null && item.original_resource_uri().count() > 0)
                        result.resource_package_uri = item.original_resource_uri().ToString();

                    // 0..* other_details StringDictionaryItem
                    //cloneObject.other_details = CloneHashTableAny(item.other_details());

                    if (item.keywords() != null && item.keywords().count() > 0)
                    {
                        string[] keywords = new string[item.keywords().count()];
                        details[i - 1].keywords = keywords;

                        for (int j = 1; j <= keywords.Length; j++)
                        {
                            if (item.keywords().i_th(j) != null)
                                keywords[j - 1] = item.keywords().i_th(j).ToString();
                        }
                    }

                    o.details().forth();
                }

                result.details = details;
            }

            return result;
        }
        internal void AddDescriptionItem(CODE_PHRASE a_language)
        {
            RESOURCE_DESCRIPTION_ITEM rdi = new RESOURCE_DESCRIPTION_ITEM();
            RESOURCE_DESCRIPTION_ITEM[] descriptionItems;
            rdi.language = a_language;

            if (_archetype.description.details == null)
            {
                //create an array
                descriptionItems = Array.CreateInstance(typeof(RESOURCE_DESCRIPTION_ITEM), 1) as RESOURCE_DESCRIPTION_ITEM[];
                descriptionItems[0] = rdi;
            }
            else
            {
                //resize the array
                descriptionItems = _archetype.description.details;
                int i = descriptionItems.Length;
                Array.Resize(ref descriptionItems, i + 1);
                descriptionItems[i] = rdi;

                foreach (RESOURCE_DESCRIPTION_ITEM descItem in _archetype.description.details)
                {
                    //copy from the primary language
                    string originalLanguage = _archetype.original_language.code_string;

                    if (descItem.language.code_string == originalLanguage)
                    {
                        rdi.purpose = string.Format("{0}{1}({2})", "*", descItem.purpose, originalLanguage);

                        if (rdi.use != null && rdi.use != "")
                        {
                            rdi.use = string.Format("{0}{1}({2})", "*", descItem.use, originalLanguage);
                        }

                        if (rdi.misuse != null && rdi.misuse != "")
                        {
                            rdi.misuse = string.Format("{0}{1}({2})", "*", descItem.misuse, originalLanguage);
                        }

                        if (rdi.original_resource_uri != null && rdi.original_resource_uri.ToString() != "")
                        {                            
                            rdi.original_resource_uri = descItem.original_resource_uri;
                        }
                    }
                }
            }

            _archetype.description.details = descriptionItems;
        }