public ButtonPressCounter(IClock clock, TimeSpan debounceInterval, TimeSpan buttonPressGroupFinalization) { if (buttonPressGroupFinalization.TotalMilliseconds <= 2*debounceInterval.TotalMilliseconds) throw new ArgumentOutOfRangeException("debounceInterval", "Group finalization interval must be GT 2*debounce interval"); _debounceInterval = debounceInterval; _buttonPressGroupFinalization = buttonPressGroupFinalization; _lastPress = DateTime.MinValue; _notifyHandle = clock.Register(buttonPressGroupFinalization, (nc) => Tick()); }