/**
 * @class CM_Page_Abstract
 * @extends CM_Component_Abstract
 */
var CM_Page_Abstract = CM_Component_Abstract.extend({

  /** @type String */
  _class: 'CM_Page_Abstract',

  /** @type String[]|Null */
  _stateParams: null,

  /** @type String|Null */
  _fragment: null,

  _ready: function() {
    CM_Component_Abstract.prototype._ready.call(this);

    if (this.hasStateParams()) {
      var location = window.location;
      var params = queryString.parse(location.search);
      var state = _.pick(params, _.intersection(_.keys(params), this.getStateParams()));
      this.routeToState(state, location.pathname + location.search);
    }
  },

  /**
   * @returns {String|Null}
   */
  getFragment: function() {
    return this._fragment;
  },

  /**
   * @returns {Boolean}
   */
  hasStateParams: function() {
    return null !== this._stateParams;
  },

  /**
   * @returns {String[]}
   */
  getStateParams: function() {
    if (!this.hasStateParams()) {
      cm.error.triggerThrow('Page has no state params');
    }
    return this._stateParams;
  },

  /**
   * @param {Object} state
   * @param {String} fragment
   */
  routeToState: function(state, fragment) {
    this._fragment = fragment;
    this._changeState(state);
  },

  /**
   * @param {Object} state
   */
  _changeState: function(state) {
  }

});

@@ -222,16 +222,60 @@
  null,%0A%0A
+  /** @type Object%7CNull */%0A  _state: null,%0A%0A
   /** @t
@@ -293,16 +293,16 @@
 Null */%0A
-
   _fragm
@@ -607,16 +607,44 @@
 ms()));%0A
+      this.setState(state);%0A
       th
@@ -1122,32 +1122,445 @@
 teParams;%0A  %7D,%0A%0A
+  /**%0A   * @returns %7BObject%7D%0A   */%0A  getState: function() %7B%0A    if (!this.hasStateParams()) %7B%0A      cm.error.triggerThrow('Page has no state params');%0A    %7D%0A    return this._state;%0A  %7D,%0A%0A  /**%0A   * @param %7BObject%7D state%0A   */%0A  setState: function(state) %7B%0A    if (!_.isEmpty(_.difference(_.keys(state), this.getStateParams()))) %7B%0A      cm.error.triggerThrow('Invalid state');%0A    %7D%0A    this._state = state;%0A  %7D,%0A%0A
   /**%0A   * @para
@@ -1652,24 +1652,24 @@
 fragment) %7B%0A
-
     this._fr
@@ -1687,16 +1687,42 @@
 agment;%0A
+    this.setState(state);%0A
     this

store state on page when using page state routing