protected virtual void TrimItemVersions(Item item)
        {
            var pruneMe = new List<PruneAction>();

            // Get the latest valid version for this item
            var latestValidVersion = item.Publishing.GetValidVersion(DateTime.Now, true, false);
            if (latestValidVersion == null)
            {
                Log.Warn(string.Format("Item does not have a published version. This item will NOT be pruned. [{0}]", item.Paths.Path), this);
                return;
            }

            // Get an array of all possible versions that can be removed
            var versions = item.Versions.GetVersions()
                                    .Where(x => x.Version.Number < latestValidVersion.Version.Number)
                                    .OrderBy(x => x.Version.Number)
                                    .ToArray();

            Log.Debug(string.Format("[{0}][latest published version #: {1}][# of pruning candidates: {2}]", item.Paths.Path, latestValidVersion, versions.Length), this);

            // Process each item version against the Version Filter rules
            foreach (var v in versions)
            {
                var ruleContext = new RuleContext();
                ruleContext.Parameters["currentversion"] = latestValidVersion;
                ruleContext.Item = v;
                this.VersionFilterRules.Run(ruleContext);

                var a = new PruneAction
                {
                    ItemVersion = v
                };

                a.Archive = ruleContext.Parameters.ContainsKey("ArchiveThisVersion");
                a.Serialize = ruleContext.Parameters.ContainsKey("SerializeThisVersion");

                if (a.Archive || a.Serialize)
                {
                    // Passed all rules. Add to "deleteMe" list
                    pruneMe.Add(a);
                }
            }

            if (pruneMe.Count > 0)
            {
                if (pruneMe.Any(x => x.Serialize))
                {
                    // Serialize versions..
                    var serializeMe = pruneMe.Where(x => x.Serialize);
                    this.Serializer.SerializeItemVersions(item, serializeMe.Select(x => x.ItemVersion.Version.Number).ToArray());
                }

                if (pruneMe.Any(x => x.Archive))
                {
                    // Copy the to-be-deleted item versions to the Archive database..
                    this.Archiver.ArchiveItemVersions(pruneMe.Where(x => x.Archive).Select(x => x.ItemVersion).ToArray());
                }

                if (pruneMe.Any(x => !x.Archive))
                {
                    foreach (var v in pruneMe.Where(x => !x.Archive))
                    {
                        var msg = String.Format("Delete version: [{0}][{1}][vers# {2}]",
                                          item.Language.Name,
                                          item.Paths.FullPath,
                                          v.ItemVersion.Version.Number);
                        Log.Audit(msg, this);
                        v.ItemVersion.Versions.RemoveVersion();
                    }
                }
            }
        }
        protected virtual void TrimItemVersions(Item item)
        {
            var pruneMe = new List <PruneAction>();

            // Get the latest valid version for this item
            var latestValidVersion = item.Publishing.GetValidVersion(DateTime.Now, true, false);

            if (latestValidVersion == null)
            {
                Log.Warn(string.Format("Item does not have a published version. This item will NOT be pruned. [{0}]", item.Paths.Path), this);
                return;
            }

            // Get an array of all possible versions that can be removed
            var versions = item.Versions.GetVersions()
                           .Where(x => x.Version.Number < latestValidVersion.Version.Number)
                           .OrderBy(x => x.Version.Number)
                           .ToArray();

            Log.Debug(string.Format("[{0}][latest published version #: {1}][# of pruning candidates: {2}]", item.Paths.Path, latestValidVersion, versions.Length), this);


            // Process each item version against the Version Filter rules
            foreach (var v in versions)
            {
                var ruleContext = new RuleContext();
                ruleContext.Parameters["currentversion"] = latestValidVersion;
                ruleContext.Item = v;
                this.VersionFilterRules.Run(ruleContext);


                var a = new PruneAction
                {
                    ItemVersion = v
                };

                a.Archive   = ruleContext.Parameters.ContainsKey("ArchiveThisVersion");
                a.Serialize = ruleContext.Parameters.ContainsKey("SerializeThisVersion");

                if (a.Archive || a.Serialize)
                {
                    // Passed all rules. Add to "deleteMe" list
                    pruneMe.Add(a);
                }
            }

            if (pruneMe.Count > 0)
            {
                if (pruneMe.Any(x => x.Serialize))
                {
                    // Serialize versions..
                    var serializeMe = pruneMe.Where(x => x.Serialize);
                    this.Serializer.SerializeItemVersions(item, serializeMe.Select(x => x.ItemVersion.Version.Number).ToArray());
                }

                if (pruneMe.Any(x => x.Archive))
                {
                    // Copy the to-be-deleted item versions to the Archive database..
                    this.Archiver.ArchiveItemVersions(pruneMe.Where(x => x.Archive).Select(x => x.ItemVersion).ToArray());
                }

                if (pruneMe.Any(x => !x.Archive))
                {
                    foreach (var v in pruneMe.Where(x => !x.Archive))
                    {
                        var msg = String.Format("Delete version: [{0}][{1}][vers# {2}]",
                                                item.Language.Name,
                                                item.Paths.FullPath,
                                                v.ItemVersion.Version.Number);
                        Log.Audit(msg, this);
                        v.ItemVersion.Versions.RemoveVersion();
                    }
                }
            }
        }