public void PopulateTopLevel(object inputObject)
        {
            var wrapper = new GameObject("root_wrapper");

            wrapper.AddComponent <PositionWindowUnderPorts>();
            wrapper.transform.position = new Vector3(0, 0, 0);
            wrapper.transform.SetParent(this.transform, false);
            wrapper.AddComponent <VerticalLayoutGroup>();
            //wrapper.GetComponent<RectTransform>().sizeDelta = new Vector2(1,1);
            wrapper.AddComponent <Canvas>();
            wrapper.GetComponent <Canvas>().worldCamera = Camera.main;
            wrapper.AddComponent <GraphicRaycaster>();
            wrapper.GetComponent <RectTransform>().localScale = new Vector3(.0003f, .0003f, .0003f);
            var fitter = wrapper.AddComponent <ContentSizeFitter>();

            fitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
            fitter.verticalFit   = ContentSizeFitter.FitMode.PreferredSize;
            //wrapper.transform.Rotate(0,90,0);
            TopLevelElement = inputObject;

            /*if (IsList(inputObject))
             * {
             *
             *      /*Debug.Log("inputobject is a list");
             *      foreach (var item in (IEnumerable)inputObject)
             *      {
             *
             *              var inspectabelgo = generateInspectableElementGameObject(item,wrapper);
             *
             *
             *      }
             * }
             *
             * else*/if (IsDictionary(inputObject))
            {
                Debug.Log("inputobject is a dictionary");
                foreach (var pair in (IEnumerable)inputObject)
                {
                    var realpair = DictionaryHelpers.CastFrom(pair);
                    var key      = realpair.Key;
                    var value    = realpair.Value;

                    var inspectabelgo = generateInspectableElementGameObject(value, wrapper);
                }
            }



            else
            {
                Debug.Log("inputobject is a object");
                //because this is the top level, we wont reflect over this object
                //but instead just generate an element that represents it as the root.

                var inspectabelgo = generateInspectableElementGameObject(inputObject, wrapper);
            }
        }
        private void populateNextLevel(System.Object subTreeRoot)
        {
            //build a new wrapper for this next level
            var wrapper = new GameObject("sub_tree_wrapper");

            //wrapper.transform.position = this.transform.position;
            wrapper.transform.SetParent(this.transform.parent, false);
            wrapper.AddComponent <HorizontalLayoutGroup>();
            wrapper.GetComponent <HorizontalLayoutGroup>().spacing = 5;


            if (InspectorVisualization.IsList(subTreeRoot))
            {
                Debug.Log("inputobject is a list");
                foreach (var item in (IEnumerable)subTreeRoot)
                {
                    var inspectabelgo = InspectorVisualization.generateInspectableElementGameObject(item, wrapper);
                }
            }

            else if (InspectorVisualization.IsDictionary(subTreeRoot))
            {
                Debug.Log("inputobject is a dictionary");
                foreach (var pair in (IEnumerable)subTreeRoot)
                {
                    var realpair = DictionaryHelpers.CastFrom(pair);
                    var key      = realpair.Key;
                    var value    = realpair.Value;

                    InspectorVisualization.generateInspectableElementGameObject(value, wrapper);
                }
            }



            else
            {
                Debug.Log("inputobject is a object");

                if (subTreeRoot is IDynamicMetaObjectProvider)
                {
                    Debug.Log("inputobject is a dynamic object");
                    var names  = new List <string>();
                    var dynobj = subTreeRoot as IronPython.Runtime.Binding.IPythonExpandable;
                    if (dynobj != null)
                    {
                        names.AddRange(dynobj.Context.LanguageContext.GetMemberNames(Expression.Constant(dynobj)));
                    }

                    //filter names so that python private and builtin members do not show
                    var filterednames = names.Where(x => x.StartsWith("__") != true).ToList();

                    foreach (var name in filterednames)
                    {
                        var value = InspectorVisualization.GetDynamicValue(dynobj, name);

                        if (value != null)
                        {
                            InspectorVisualization.generateInspectableElementGameObject(value, wrapper);
                        }
                    }
                }

                // if object was not dynamic use regular reflection
                else
                {
                    Debug.Log("inputobject is a non dynamic object");
                    var propertyInfos = subTreeRoot.GetType().GetProperties(
                        BindingFlags.Public | BindingFlags.NonPublic              // Get public and non-public
                        | BindingFlags.Static | BindingFlags.Instance             // Get instance + static
                        | BindingFlags.FlattenHierarchy);                         // Search up the hierarchy



                    foreach (var prop in propertyInfos.ToList())
                    {
                        if (prop.GetIndexParameters().Length > 0)
                        {
                            // Property is an indexer
                            Debug.Log("this property is an indexed property, for now we won't reflect further");
                            continue;
                        }
                        try
                        {
                            var value = prop.GetValue(subTreeRoot, null);
                            InspectorVisualization.generateInspectableElementGameObject(value, wrapper, prop.Name);
                        }
                        catch (Exception e)
                        {
                            Debug.Log("could not get property" + prop.Name);
                        }
                    }
                }
            }
        }