void Selector(SerializedProperty property)
    {
        SpineSkin    attrib = (SpineSkin)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.Skins.Count; i++)
        {
            string name = data.Skins[i].Name;
            if (name.StartsWith(attrib.startsWith))
            {
                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;
        }

        SpineSkin attrib = (SpineSkin)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);
        }
    }