private IVersionProvider CreateVersionProviderFor(T newValue, T oldValue)
        {
            int initial_version = (m_VersionProvider.GetVersionFor(oldValue) + 1);

            if (newValue == null)
            {
                return(new NullObjectVersionProvider(initial_version));
            }

            Type runtimeType = newValue.GetType();

            if (HashVersionProvider.CanHandle(runtimeType))
            {
                return(new HashVersionProvider(newValue, initial_version));
            }
            else if (NotifyPropertyChangedVersionProvider.CanHandle(runtimeType))
            {
                return(new NotifyPropertyChangedVersionProvider(newValue, initial_version));
            }
            else
            {
                throw new InvalidOperationException(String.Format("No IVersionProvider found that can handle type '{0}'", typeof(T).FullName));
            }
        }