/// <summary>
        /// Restores the data after view's Loaded event is raised.
        /// </summary>
        /// <typeparam name="T">The model type.</typeparam>
        /// <param name="builder">The builder.</param>
        /// <returns>The builder.</returns>
        public static StorageInstructionBuilder <T> RestoreAfterViewLoad <T>(this StorageInstructionBuilder <T> builder)
            where T : IViewAware
        {
            return(builder.Configure(x => {
                var original = x.Restore;

                x.Restore = (instance, getKey, mode) => {
                    EventHandler <ViewAttachedEventArgs> onViewAttached = null;
                    onViewAttached = (s, e) => {
                        var fe = (FrameworkElement)e.View;
                        View.ExecuteOnLoad(fe, (s2, e2) => { original(instance, getKey, mode); });
                        instance.ViewAttached -= onViewAttached;
                    };
                    instance.ViewAttached += onViewAttached;
                };
            }));
        }
        /// <summary>
        /// Restores the data after view's LayoutUpdated event is raised.
        /// </summary>
        /// <typeparam name="T">The model type.</typeparam>
        /// <param name="builder">The builder.</param>
        /// <returns>The builder.</returns>
        public static StorageInstructionBuilder <T> RestoreAfterViewReady <T>(this StorageInstructionBuilder <T> builder)
            where T : IViewAware
        {
            return(builder.Configure(x => {
                var original = x.Restore;

                x.Restore = (instance, getKey, mode) => {
                    EventHandler <ViewAttachedEventArgs> onViewAttached = null;
                    onViewAttached = (s, e) => {
                        var fe = (FrameworkElement)e.View;
                        instance.ViewAttached -= onViewAttached;
                        EventHandler handler = null;
                        handler = (s2, e2) => {
                            original(instance, getKey, mode);
                            fe.LayoutUpdated -= handler;
                        };
                        fe.LayoutUpdated += handler;
                    };
                    instance.ViewAttached += onViewAttached;
                };
            }));
        }
        /// <summary>
        /// Restores the data when IActivate.Activated is raised.
        /// </summary>
        /// <typeparam name="T">The model type.</typeparam>
        /// <param name="builder">The builder.</param>
        /// <returns>The builder.</returns>
        public static StorageInstructionBuilder <T> RestoreAfterActivation <T>(this StorageInstructionBuilder <T> builder)
            where T : IActivate
        {
            return(builder.Configure(x => {
                var original = x.Restore;

                x.Restore = (instance, getKey, mode) => {
                    if (instance.IsActive)
                    {
                        original(instance, getKey, mode);
                    }
                    else
                    {
                        EventHandler <ActivationEventArgs> onActivate = null;
                        onActivate = (s, e) => {
                            original(instance, getKey, mode);
                            instance.Activated -= onActivate;
                        };
                        instance.Activated += onActivate;
                    }
                };
            }));
        }
 /// <summary>
 /// Stores the data in the permanent ApplicationSettings.
 /// </summary>
 /// <typeparam name="T">The model type.</typeparam>
 /// <param name="builder">The builder.</param>
 /// <returns>The builder.</returns>
 public static StorageInstructionBuilder <T> InAppSettings <T>(this StorageInstructionBuilder <T> builder)
 {
     return(builder.Configure(x => { x.StorageMechanism = x.Owner.Coordinator.GetStorageMechanism <AppSettingsStorageMechanism>(); }));
 }