internal static void Cleanup(this VisualElement self)
        {
            if (self == null)
            {
                throw new ArgumentNullException("self");
            }

            IVisualElementRenderer renderer = Platform.GetRenderer(self);

            foreach (Element element in self.Descendants())
            {
                var visual = element as VisualElement;
                if (visual == null)
                {
                    continue;
                }

                IVisualElementRenderer childRenderer = Platform.GetRenderer(visual);
                if (childRenderer != null)
                {
                    childRenderer.DestroyObject();
                    Platform.SetRenderer(visual, null);
                }
            }

            if (renderer != null)
            {
                renderer.DestroyObject();
                Platform.SetRenderer(self, null);
            }
        }