private void CreateComponents(GameObject go, JSON.Object obj)
    {
        //
        // This is the 'stupid' but 'safe & predictable way of doing this.
        //
        switch (obj.GetString("type", "UnityEngine.UI.Text"))
        {
        case "UnityEngine.UI.Text":
        {
            var c = go.AddComponent <UnityEngine.UI.Text>();
            c.text      = obj.GetString("text", "Text");
            c.fontSize  = obj.GetInt("fontSize", 14);
            c.font      = FileSystem.Load <Font>("Assets/Content/UI/Fonts/" + obj.GetString("font", "RobotoCondensed-Bold.ttf"));
            c.alignment = (TextAnchor)System.Enum.Parse(typeof(TextAnchor), obj.GetString("align", "UpperLeft"));
            c.color     = ColorEx.Parse(obj.GetString("color", "1.0 1.0 1.0 1.0"));
            GraphicComponentCreated(c, obj);
            break;
        }


        case "UnityEngine.UI.Image":
        {
            var c = go.AddComponent <UnityEngine.UI.Image>();
            c.sprite   = FileSystem.Load <Sprite>(obj.GetString("sprite", "Assets/Content/UI/UI.Background.Tile.psd"));
            c.material = FileSystem.Load <Material>(obj.GetString("material", "Assets/Icons/IconMaterial.mat"));
            c.color    = ColorEx.Parse(obj.GetString("color", "1.0 1.0 1.0 1.0"));
            c.type     = (UnityEngine.UI.Image.Type)System.Enum.Parse(typeof(UnityEngine.UI.Image.Type), obj.GetString("imagetype", "Simple"));

            if (obj.ContainsKey("png"))
            {
                PngGraphicLoadRequested(c, uint.Parse(obj.GetString("png")));
            }

            GraphicComponentCreated(c, obj);

            break;
        }

        case "UnityEngine.UI.RawImage":
        {
            var c = go.AddComponent <UnityEngine.UI.RawImage>();
            c.texture = FileSystem.Load <Texture>(obj.GetString("sprite", "Assets/Icons/rust.png"));
            c.color   = ColorEx.Parse(obj.GetString("color", "1.0 1.0 1.0 1.0"));

            if (obj.ContainsKey("material"))
            {
                c.material = FileSystem.Load <Material>(obj.GetString("material"));
            }

            if (obj.ContainsKey("url"))
            {
                StartCoroutine(LoadTextureFromWWW(c, obj.GetString("url")));
            }

            if (obj.ContainsKey("png"))
            {
                PngGraphicLoadRequested(c, uint.Parse(obj.GetString("png")));
            }

            GraphicComponentCreated(c, obj);

            break;
        }

        case "UnityEngine.UI.Button":
        {
            var c = go.AddComponent <UnityEngine.UI.Button>();

            if (obj.ContainsKey("command"))
            {
                var cmd = obj.GetString("command");
                c.onClick.AddListener(() => {
                        ConsoleSystem.ClientRunOnServer(cmd);
                    });
            }

            if (obj.ContainsKey("close"))
            {
                var pnlName = obj.GetString("close");
                c.onClick.AddListener(() => {
                        DestroyPanel(pnlName);
                    });
            }

            // bg image
            var img = go.AddComponent <UnityEngine.UI.Image>();
            img.sprite   = FileSystem.Load <Sprite>(obj.GetString("sprite", "Assets/Content/UI/UI.Background.Tile.psd"));
            img.material = FileSystem.Load <Material>(obj.GetString("material", "Assets/Icons/IconMaterial.mat"));
            img.color    = ColorEx.Parse(obj.GetString("color", "1.0 1.0 1.0 1.0"));
            img.type     = (UnityEngine.UI.Image.Type)System.Enum.Parse(typeof(UnityEngine.UI.Image.Type), obj.GetString("imagetype", "Simple"));

            c.image = img;

            GraphicComponentCreated(img, obj);

            break;
        }

        case "UnityEngine.UI.Outline":
        {
            var c = go.AddComponent <UnityEngine.UI.Outline>();
            c.effectColor     = ColorEx.Parse(obj.GetString("color", "1.0 1.0 1.0 1.0"));
            c.effectDistance  = Vector2Ex.Parse(obj.GetString("distance", "1.0 -1.0"));
            c.useGraphicAlpha = obj.ContainsKey("useGraphicAlpha");
            break;
        }

        case "NeedsCursor":
        {
            go.AddComponent <NeedsCursor>();
            break;
        }

        case "RectTransform":
        {
            var rt = go.GetComponent <RectTransform>();
            if (rt)
            {
                rt.anchorMin = Vector2Ex.Parse(obj.GetString("anchormin", "0.0 0.0"));
                rt.anchorMax = Vector2Ex.Parse(obj.GetString("anchormax", "1.0 1.0"));
                rt.offsetMin = Vector2Ex.Parse(obj.GetString("offsetmin", "0.0 0.0"));
                rt.offsetMax = Vector2Ex.Parse(obj.GetString("offsetmax", "1.0 1.0"));
            }
            break;
        }
        }
    }