public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        label = EditorGUI.BeginProperty(position, label, property);
        UnityEngine.Object comp           = (UnityEngine.Object)Introspector.GetParent(property);
        ComponentField     componentField = (ComponentField)Introspector.GetValue(comp, property.name);

        EditorGUI.HelpBox(position, "", MessageType.None);

        // label
        position.height = 16;
        EditorGUI.PrefixLabel(position, label);

        // component
        Component originalComponent = componentField.component;

        EditorGUI.indentLevel += 1;
        position.y            += 16;
        int  buttonWidth  = 50;
        Rect tempPosition = position;

        tempPosition.width -= buttonWidth + 3;

        EditorGUI.PropertyField(tempPosition, property.FindPropertyRelative("component"));

        // button
        tempPosition.x     = tempPosition.x + tempPosition.width + 3;
        tempPosition.width = buttonWidth;
        bool copiedComponent = stEditor.clipboard is Component;
        var  tooltip         = (copiedComponent) ? stEditor.clipboard.ToString() :
                               "Use Get Component\nin component menu";
        var button = new GUIContent("Put", tooltip);

        if (GUI.Button(tempPosition, button) && copiedComponent)
        {
            Undo.RecordObject(comp, "Set ComponentField '" + property.name + "' Component");
            componentField.component = stEditor.clipboard;
        }
        GUI.enabled = true;

        //member
        if (componentField.component != originalComponent)
        {
            componentField.member = "";
        }
        position.y += 16;
        if (componentField.component == null)
        {
            EditorGUI.Popup(position, "Member", 0, new string[] {});
        }
        else
        {
            var availableMembers = Introspector
                                   .GetSmartMemberList(componentField.component);
            int memberIndex = availableMembers.ToList().FindIndex(member => member == componentField.member);
            int selected    = EditorGUI.Popup(position, "Member", memberIndex, availableMembers);
            if (selected >= 0)
            {
                Undo.RecordObject(comp, "Set ComponentField '" + property.name + "' Member");
                componentField.member = availableMembers[selected];
            }
        }
//EditorGUI.PropertyField( position, property.FindPropertyRelative("member") );
        EditorGUI.EndProperty();
    }