protected override void DrawChild(SerializedProperty parent, SerializedProperty child, Slices slices)
        {
            var childSlices = new SlicesImpl();

            childSlices.AddBefore(new DrawableImpl(rect => DrawElementContextMenu(rect, parent, child)));
            base.DrawChild(parent, child, childSlices);

            slices.Add(childSlices);
        }
        private void DrawChildWithDecorators(SerializedProperty parent, SerializedProperty child, Slices slices, bool isLast)
        {
            space.Draw(child, slices);

            var childSlices = new SlicesImpl();

            DrawChild(parent, child, childSlices);
            if (NeedDrawHeader(parent, child))
            {
                header.Draw(child, childSlices);
            }
            slices.Add(childSlices);
        }
        private void DrawChildren(SerializedProperty property, Slices slices)
        {
            var childSlices = new SlicesImpl();

            GetChildren(property)
            .ForEachExceptLast((child) => {
                DrawChildWithDecorators(property, child, childSlices, false);

                if (childSlices.CountPayload > 0 && NeedDrawSeparator(child))
                {
                    separator.Draw(child, childSlices);
                }
            },
                               child => DrawChildWithDecorators(property, child, childSlices, true)
                               );
            if (childSlices.CountPayload > 0)
            {
                slices.Add(childSlices);
            }
        }
        public Slices this[SerializedProperty property] {
            get {
                if (!SettingsMenu.Value.CacheOptimization)
                {
                    var slices = new SlicesImpl();
                    calculate(property, slices);
                    return(slices);
                }

                lastId = GetId(property);
                if (cache.ContainsKey(lastId))
                {
                    return(cache[lastId]);
                }
                else
                {
                    var slices = new SlicesImpl();
                    calculate(property, slices);
                    cache.Add(lastId, slices);
                    IsDirty = true;
                    return(slices);
                }
            }
        }