/// <summary>
        /// Tests if the actual DateTime is approximately equal to the
        /// expected value within the provided allowed drift value
        /// </summary>
        /// <param name="continuation">Continuation to operate on</param>
        /// <param name="expected">Expected value</param>
        /// <param name="comparer"></param>
        /// <param name="customMessageGenerator">Generates a custom message to include when
        /// this expectation fails</param>
        /// <returns></returns>
        public static IMore <DateTime> Equal(
            this IApproximately <DateTime> continuation,
            DateTime expected,
            IEqualityComparer <DateTime> comparer,
            Func <string> customMessageGenerator)
        {
            continuation.AddMatcher(actual =>
            {
                var passed = comparer.Equals(actual, expected);

                return(new MatcherResult(passed,
                                         () =>
                {
                    var allowed =
                        comparer.TryGetPropertyValue <TimeSpan?>(
                            nameof(EqualWithinTimespan.AllowedDrift));
                    var message =
                        $@"Expected {
                                    actual.Stringify()
                                } to approximately equal {
                                    expected.Stringify()
                                }";
                    if (allowed.HasValue)
                    {
                        message += $" within a timespan of {allowed}";
                    }

                    return FinalMessageFor(() => message,
                                           customMessageGenerator);
                }));
            });
            return(continuation.More());
        }