public DismissableOnboardingStep(IOnboardingStep onboardingStep, string key, IOnboardingStorage onboardingStorage)
        {
            Ensure.Argument.IsNotNull(onboardingStep, nameof(onboardingStep));
            Ensure.Argument.IsNotNullOrWhiteSpaceString(key, nameof(key));
            Ensure.Argument.IsNotNull(onboardingStorage, nameof(onboardingStorage));

            this.onboardingStorage = onboardingStorage;

            Key = key;

            wasDismissedSubject = new BehaviorSubject <bool>(
                onboardingStorage.WasDismissed(this)
                );

            ShouldBeVisible = onboardingStep
                              .ShouldBeVisible
                              .CombineLatest(
                wasDismissedSubject.AsObservable(),
                (shouldBeVisible, wasDismissed) => shouldBeVisible && !wasDismissed);
        }