public virtual void FindDifferences(object oldState, object newState, StateChanges stateChanges, int maxDepth)
        {
            values = new Dictionary <string, StateChange>();

            if (oldState != null)
            {
                beingTraversed = BeingTraversed.Old;
                traverser.TraverseInstance(oldState, maxDepth, this);
            }

            if (newState != null)
            {
                beingTraversed = BeingTraversed.New;
                traverser.TraverseInstance(newState, maxDepth, this);
            }

            beingTraversed = BeingTraversed.Nothing;

            foreach (var kvp in values)
            {
                var change = kvp.Value;

                if (change.OldValue == null && change.NewValue != null)
                {
                    stateChanges.Changes.Add(change);
                }

                else if (change.OldValue != null && !change.OldValue.Equals(change.NewValue))
                {
                    stateChanges.Changes.Add(change);
                }
            }
        }
        public virtual void FindDifferences
        (
            object oldState,
            object newState,
            StateChanges stateChanges,
            int maxDepth,
            Func <FieldInfo, IReadOnlyInstanceTraversalContext, bool> fieldIgnoreFunc       = null,
            Func <PropertyInfo, IReadOnlyInstanceTraversalContext, bool> propertyIgnoreFunc = null
        )
        {
            if (fieldIgnoreFunc == null)
            {
                fieldIgnoreFunc = (field, context) => false;
            }

            if (propertyIgnoreFunc == null)
            {
                propertyIgnoreFunc = (prop, context) => false;
            }

            fieldIgnoreFn    = fieldIgnoreFunc;
            propertyIgnoreFn = propertyIgnoreFunc;

            values = new Dictionary <string, StateChange>();

            if (oldState != null)
            {
                beingTraversed = BeingTraversed.Old;
                traverser.TraverseInstance(oldState, maxDepth, this);
            }

            if (newState != null)
            {
                beingTraversed = BeingTraversed.New;
                traverser.TraverseInstance(newState, maxDepth, this);
            }

            beingTraversed = BeingTraversed.Nothing;

            foreach (var kvp in values)
            {
                var change = kvp.Value;

                if (change.OldValue == null && change.NewValue != null)
                {
                    stateChanges.Changes.Add(change);
                }

                else if (change.OldValue != null && !change.OldValue.Equals(change.NewValue))
                {
                    stateChanges.Changes.Add(change);
                }
            }
        }