//recursively get all the types this object represents.
        private SortedSet <Type> GetTypesForImport(Object value)
        {
            Type             valueType  = value.GetType();
            SortedSet <Type> set        = new SortedSet <Type>();
            IEnumerable      collection = value as IEnumerable;

            if (collection != null)
            {
                foreach (var item in collection)
                {
                    set.UnionWith(GetTypesForImport(item));
                }
            }
            else if (valueType.IsGenericType)
            {
                Type generictype = valueType.GetGenericTypeDefinition();
                set.UnionWith(generictype.GetGenericArguments());
                //also add the valueType to be used as raw data
                set.Add(valueType);
            }
            else
            {
                set.Add(CLRObjectMarshaler.GetPublicType(valueType));
            }

            return(set);
        }
        internal ImportNode Compile(ImportModuleHandler importer)
        {
            ImportNode impNode = null;

            foreach (var item in mData)
            {
                SortedSet <Type> types = GetTypesForImport(item.Value.Data);
                foreach (var type in types)
                {
                    if (CLRObjectMarshaler.IsMarshaledAsNativeType(type))
                    {
                        continue;
                    }
                    ImportNode node = importer.Import(type.Assembly.Location, type.FullName, "");
                    if (impNode != null && node != null)
                    {
                        impNode.CodeNode.Body.AddRange(node.CodeNode.Body);
                    }
                    else
                    {
                        impNode = node;
                    }
                }
                if (impNode == null)
                {
                    impNode = new ImportNode()
                    {
                        ModuleName = "ExternalContext", CodeNode = new ProtoCore.AST.AssociativeAST.CodeBlockNode()
                    }
                }
                ;
                impNode.CodeNode.Body.Add(ContextDataMethodCallNode(item.Value));
            }
            return(impNode);
        }