public void SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context)
        {
            if (DisableSerialization)
            {
                return;
            }

            Assert.ArgumentNotNull(itemDefinition, "itemDefinition");
            Assert.ArgumentNotNull(changes, "changes");

            var sourceItem = GetItemWithoutCache(changes.Item);

            if (!_predicate.Includes(sourceItem).IsIncluded)
            {
                return;
            }

            string oldName = changes.Renamed ? changes.Properties["name"].OriginalValue.ToString() : string.Empty;

            if (changes.Renamed && !oldName.Equals(sourceItem.Name, StringComparison.Ordinal))             // it's a rename, in which the name actually changed (template builder will cause 'renames' for the same name!!!)
            {
                _serializationProvider.RenameSerializedItem(sourceItem, oldName);
                _logger.RenamedItem(_serializationProvider.LogName, sourceItem, oldName);
            }
            else if (HasConsequentialChanges(changes))             // it's a simple update - but we reject it if only inconsequential fields (last updated, revision) were changed - again, template builder FTW
            {
                _serializationProvider.SerializeItem(sourceItem);
                _logger.SavedItem(_serializationProvider.LogName, sourceItem, "Saved");
            }
        }