/// <summmary>
        /// <see cref="PropertyDrawer.OnGUI" />
        /// </summmary>
        override public void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
        {
            EditorGUI.BeginProperty(rect, label, property);
            EditorGUI.BeginChangeCheck();

            ResourceReference reference;

            reference = property.objectReferenceValue as ResourceReference;

            Object resource;

            resource = AssetDatabase.LoadAssetAtPath(reference != null ? AssetDatabase.GUIDToAssetPath(reference.Guid) : null, ResourceType);
            resource = EditorGUI.ObjectField(rect, label, resource, ResourceType, false);

            if (EditorGUI.EndChangeCheck())
            {
                if (resource != null)
                {
                    reference = ResourceReferenceEditor.FindOrCreateReference(resource);
                    property.objectReferenceValue = reference;
                }
                else if (reference != null)
                {
                    reference = null;
                    property.objectReferenceValue = null;
                }
            }

            EditorGUI.EndProperty();
        }
        private static void OnPostprocessAllAssets(string[] importedAssetPaths, string[] deletedAssetPaths, string[] movedAssetPaths, string[] movedFromAssetPaths)
        {
            if (deletedAssetPaths.Length != 0 || movedFromAssetPaths.Length != 0)
            {
                var assetGuids = (
                    AssetDatabase
                    .FindAssets("t:ResourceReference")
                    .Select(referenceGuid => ResourceReferenceEditor.ReferenceGuidToAssetGuid(referenceGuid))
                    );

                try {
                    AssetDatabase.StartAssetEditing();
                    foreach (string assetGuid in deletedAssetPaths.Select(path => AssetDatabase.AssetPathToGUID(path)).Intersect(assetGuids))
                    {
                        string referencePath;
                        referencePath = AssetDatabase.GUIDToAssetPath(ResourceReferenceEditor.AssetGuidToReferenceGuid(assetGuid));

                        if (!string.IsNullOrEmpty(referencePath))
                        {
                            AssetDatabase.DeleteAsset(referencePath);
                        }
                    }
                    foreach (string assetGuid in movedAssetPaths.Select(path => AssetDatabase.AssetPathToGUID(path)).Intersect(assetGuids))
                    {
                        string referencePath;
                        referencePath = AssetDatabase.GUIDToAssetPath(ResourceReferenceEditor.AssetGuidToReferenceGuid(assetGuid));

                        string newPath;
                        newPath = ResourceReferenceEditor.GetReferencePath(assetGuid);

                        if (string.IsNullOrEmpty(AssetDatabase.ValidateMoveAsset(referencePath, newPath)))
                        {
                            AssetDatabase.MoveAsset(referencePath, newPath);
                        }
                    }
                } finally {
                    AssetDatabase.StopAssetEditing();
                }
            }
        }