/// <summary>
        /// Displays a selection control for all properties and fields of a given type on an object.
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static void BindingField(TypeHelper.BindingMap source, Type memberType)
        {
            Assert.IsNotNull(source);
            EditorGUILayout.BeginHorizontal();
            source.DestObj = EditorGUILayout.ObjectField(source.DestObj, typeof(UnityEngine.Object), true);

            if (source.DestObj != null)
            {
                //compile list of all properties and fields on this dest
                List <string> names  = new List <string>(10);
                FieldInfo[]   fields = source.DestObj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
                foreach (var member in fields)
                {
                    if (member.FieldType == memberType)
                    {
                        names.Add(member.Name);
                    }
                }

                PropertyInfo[] props = source.DestObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
                foreach (var member in props)
                {
                    if (member.PropertyType == memberType && member.CanWrite)
                    {
                        names.Add(member.Name);
                    }
                }

                //display controls for member path
                GUILayout.Space(25);
                source.PathIndex = EditorGUILayout.Popup(source.PathIndex, names.ToArray());
                if (source.PathIndex >= names.Count)
                {
                    source.Path = "";
                }
                else
                {
                    source.Path = names[source.PathIndex];
                }
            }
            EditorGUILayout.EndHorizontal();
        }
        /// <summary>
        /// Displays a control that allows choosing a binding source string as well as a binding source destination.
        /// </summary>
        /// <param name="binding"></param>
        public static bool BindingField(string[] keys, TypeHelper.BindingMap binding, Type memberType)
        {
            //controls for selecting dest key
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("-", GUILayout.Width(20)))
            {
                return(true);
            }
            binding.KeyIndex = EditorGUILayout.Popup(binding.KeyIndex, keys, GUILayout.Width(200));
            if (binding.KeyIndex >= keys.Length)
            {
                binding.DestObj   = null;
                binding.SourceKey = "";
            }
            else
            {
                //binding.DestObj = EditorGUILayout.ObjectField(binding.DestObj, typeof(UnityEngine.Object), true);
                BindingField(binding, memberType);
                binding.SourceKey = keys[binding.KeyIndex];
            }
            EditorGUILayout.EndHorizontal();

            return(false);
        }