docs: function WMClock(ticks,     // @arg TickFunctionArray = [] - [tick, ...]
                   options) { // @arg Object = {} - { start, vsync, speed, pulse, suspend, baseTime }
                              // @options.start Boolean = false - auto start.
                              // @options.vsync Boolean = false - use requestAnimationFrame(false is use setInterval).
                              // @options.speed Number = 16.666 - setInterval(, speed)
                              // @options.pulse Number = 0.0 - overwrite delta time(unit: ms)(range of oscillation time).
                              // @options.suspend Boolean = false - automatically suspend by page visibility event.
                              // @options.baseTime Number = 0.0 - setBaseTime value
                              // @desc Master Clock.
  //{@dev
      $valid($type(ticks,   "TickFunctionArray|omit"), WMClock, "ticks");
      $valid($type(options, "Object|omit"), WMClock, "options");
      $valid($keys(options, "start|vsync|speed|pulse|suspend|baseTime"), WMClock, "options");
      if (options) {
          $valid($type(options.start, "Boolean|omit"), WMClock, "options.start");
          $valid($type(options.vsync, "Boolean|omit"), WMClock, "options.vsync");
          $valid($type(options.speed, "Number|omit"),  WMClock, "options.speed");
          $valid($type(options.pulse, "Number|omit"),  WMClock, "options.pulse");
          $valid($type(options.suspend, "Boolean|omit"), WMClock, "options.suspend");
          $valid($type(options.baseTime, "Number|omit"), WMClock, "options.baseTime");
      }
  //}@dev
  
      options = options || {};
  
      var that = this;
  
      this._mode    = MODE_INTERVAL;              // Integer - mode. MODE_XXX
      this._ticks   = [];                         // TickFunctionArray - callback functions. [tick, ...]
      this._speed   = options["speed"] || 16.666; // Number - setInterval(, speed)
      this._pulse   = options["pulse"] || 0.0;    // Number - overwrite delta time(range of oscillation time).
      this._active  = false;                      // Boolean - active state.
      this._timerID = 0;                          // Integer - timer id.
      this._counter = 0;                          // Integer - callback counter.
      this._timeStamp = -1;                       // Number - last time stamp.
      this._baseTime  = 0.0;
      this._baseTimeDiff = 0.0;                   // difference time
      this._enterFrame = _enterFrame.bind(this);  // Function - _enterFrame.bind(this)
      this._suspend = { begin: 0, total: 0 };
  
      (ticks || []).forEach(WMClock_on, this);
  
      if (options["vsync"]) {
          this._mode = global["requestAnimationFrame"] ? MODE_RAF : MODE_RAF_EMULATE;
      }
      if (options["suspend"]) { // auto suspend
          if (global["PageVisibilityEvent"]) {
              global["PageVisibilityEvent"]["on"](_onsuspend);
          }
      }
      if (options["start"]) { // auto start
          this["start"]();
      }
      this["setBaseTime"](options["baseTime"] || 0.0);
  
      function _onsuspend(pageHide) {
          if (pageHide) {
              that._suspend.begin = Date.now();
              that["stop"]();
          } else {
              that._suspend.total += ( Date.now() - that._suspend.begin );
              that._suspend.begin = 0;
              that["start"]();
          }
      }
  }