/// <summary>
        /// This method is called before the result of a mutating operation
        /// represented by the specified entry object is committed into the
        /// underlying cache.
        /// </summary>
        /// <remarks>
        /// An implementation of this method can evaluate the change by
        /// analyzing the original and the new value, and can perform any of
        /// the following:
        /// <list type="bullet">
        /// <item>
        /// override the requested change by setting
        /// <see cref="IInvocableCacheEntry.Value"/> to a different value;
        /// </item>
        /// <item>
        /// undo the pending change by resetting the entry value to the
        /// original value obtained from
        /// <see cref="ICacheTriggerEntry.OriginalValue"/>
        /// </item>
        /// <item>
        /// remove the entry from the underlying cache by calling
        /// <see cref="IInvocableCacheEntry.Remove"/>
        /// </item>
        /// <item>
        /// reject the pending change by throwing an <see cref="Exception"/>,
        /// which will prevent any changes from being committed, and will
        /// result in the exception being thrown from the operation that
        /// attempted to modify the cache; or
        /// </item>
        /// <item>
        /// do nothing, thus allowing the pending change to be committed to
        /// the underlying cache.
        /// </item>
        /// </list>
        /// </remarks>
        /// <param name="entry">
        /// An <see cref="ICacheTriggerEntry"/> object that represents the
        /// pending change to be committed to the cache, as well as the
        /// original state of the entry.
        /// </param>
        public virtual void Process(ICacheTriggerEntry entry)
        {
            if (entry.IsPresent && !InvocableCacheHelper.EvaluateEntry(m_filter, entry))
            {
                switch (m_action)
                {
                case ActionCode.Rollback:
                default:
                    throw new ArgumentException("Rejecting " + entry +
                                                " by trigger " + this);

                case ActionCode.Ignore:
                    object value = entry.OriginalValue;
                    if (value != null || entry.IsOriginalPresent)
                    {
                        entry.SetValue(value, true);
                    }
                    else
                    {
                        entry.Remove(true);
                    }
                    break;

                case ActionCode.Remove:
                    entry.Remove(true);
                    break;
                }
            }
        }
            public void Process(ICacheTriggerEntry entry)
            {
                SimplePerson person  = (SimplePerson)entry.Extract(IdentityExtractor.Instance);
                String       sName   = person.LastName;
                String       sNameUC = sName.ToUpper();

                if (!sNameUC.Equals(sName))
                {
                    person.LastName = sNameUC;
                    entry.SetValue(person, false);
                }
            }