void Selector(SerializedProperty property)
    {
        SpineSlot    attrib = (SpineSlot)attribute;
        SkeletonData data   = skeletonDataAsset.GetSkeletonData(true);

        if (data == null)
        {
            return;
        }

        GenericMenu menu = new GenericMenu();

        menu.AddDisabledItem(new GUIContent(skeletonDataAsset.name));
        menu.AddSeparator("");

        for (int i = 0; i < data.Slots.Count; i++)
        {
            string name = data.Slots[i].Name;
            if (name.StartsWith(attrib.startsWith))
            {
                menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property));
            }
        }

        menu.ShowAsContext();
    }
    void Selector(SerializedProperty property)
    {
        SpineSlot    attrib = (SpineSlot)attribute;
        SkeletonData data   = skeletonDataAsset.GetSkeletonData(true);

        if (data == null)
        {
            return;
        }

        GenericMenu menu = new GenericMenu();

        menu.AddDisabledItem(new GUIContent(skeletonDataAsset.name));
        menu.AddSeparator("");

        for (int i = 0; i < data.Slots.Count; i++)
        {
            string name = data.Slots[i].Name;
            if (name.StartsWith(attrib.startsWith))
            {
                if (attrib.containsBoundingBoxes)
                {
                    int slotIndex = i;

                    List <Attachment> attachments = new List <Attachment>();
                    foreach (var skin in data.Skins)
                    {
                        skin.FindAttachmentsForSlot(slotIndex, attachments);
                    }

                    bool hasBoundingBox = false;
                    foreach (var attachment in attachments)
                    {
                        if (attachment is BoundingBoxAttachment)
                        {
                            menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property));
                            hasBoundingBox = true;
                            break;
                        }
                    }

                    if (!hasBoundingBox)
                    {
                        menu.AddDisabledItem(new GUIContent(name));
                    }
                }
                else
                {
                    menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property));
                }
            }
        }

        menu.ShowAsContext();
    }
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        if (property.propertyType != SerializedPropertyType.String)
        {
            EditorGUI.LabelField(position, "ERROR:", "May only apply to type string");
            return;
        }

        SpineSlot attrib = (SpineSlot)attribute;

        var dataProperty = property.serializedObject.FindProperty(attrib.dataField);

        if (dataProperty != null)
        {
            if (dataProperty.objectReferenceValue is SkeletonDataAsset)
            {
                skeletonDataAsset = (SkeletonDataAsset)dataProperty.objectReferenceValue;
            }
            else if (dataProperty.objectReferenceValue is SkeletonRenderer)
            {
                var renderer = (SkeletonRenderer)dataProperty.objectReferenceValue;
                if (renderer != null)
                {
                    skeletonDataAsset = renderer.skeletonDataAsset;
                }
            }
            else
            {
                EditorGUI.LabelField(position, "ERROR:", "Invalid reference type");
                return;
            }
        }
        else if (property.serializedObject.targetObject is Component)
        {
            var component = (Component)property.serializedObject.targetObject;
            if (component.GetComponentInChildren <SkeletonRenderer>() != null)
            {
                var skeletonRenderer = component.GetComponentInChildren <SkeletonRenderer>();
                skeletonDataAsset = skeletonRenderer.skeletonDataAsset;
            }
        }

        if (skeletonDataAsset == null)
        {
            EditorGUI.LabelField(position, "ERROR:", "Must have reference to a SkeletonDataAsset");
            return;
        }

        position = EditorGUI.PrefixLabel(position, label);

        if (GUI.Button(position, property.stringValue, EditorStyles.popup))
        {
            Selector(property);
        }
    }