Animation Flash ActionScript

/*
 * hexagon framework - Multi-Purpose ActionScript 3 Framework.
 * Copyright (C) 2007 Hexagon Star Softworks
 *       __    __
 *    __/  \__/  \__    __
 *   /  \__/HEXAGON \__/  \
 *   \__/  \__/ FRAMEWORK_/
 *            \__/  \__/
 *
 * ``The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 */
package com.hexagonstar.util.debug
{
  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.TimerEvent;
  import flash.utils.Timer;
  
  /**
   * Simple Stage framrate measuring class.
   */
  public class FPSMeter extends EventDispatcher
  {
    // Properties /////////////////////////////////////////////////////////////////
    
    public static const FPS_UPDATE:String = "fpsUpdate";
    
    private var _stage:Stage;
    private var _timer:Timer;
    private var _fps:int;
    private var _isRunning:Boolean;
    
    // Constructor ////////////////////////////////////////////////////////////////
    
    /**
     * Constructor
     */
    public function FPSMeter(stage:Stage)
    {
      _stage = stage;
      _fps = 0;
      _isRunning = false;
    }
    
    // Public Methods /////////////////////////////////////////////////////////////
    
    /**
     * Starts FPS polling.
     */
    public function start(pollInterval:uint = 1000):void
    {
      if (!_isRunning)
      {
        _isRunning = true;
        _timer = new Timer(pollInterval, 0);
        _timer.addEventListener(TimerEvent.TIMER, onTimer);
        _stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        _timer.start();
      }
    }
    
    /**
     * Stops FPS polling.
     */
    public function stop():void
    {
      if (_isRunning)
      {
        _isRunning = false;
        _timer.stop();
        _timer.removeEventListener(TimerEvent.TIMER, onTimer);
        _stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        _timer = null;
      }
    }
    
    /**
     * Returns the current FPS.
     * 
     * @return The currently polled frames per second.
     */
    public function getFPS():int
    {
      return _fps;
    }
    
    // Private Methods ////////////////////////////////////////////////////////////
    
    /**
     * Called on every Timer event.
     * @private
     */
    private function onTimer(event:TimerEvent):void
    {
      dispatchEvent(new Event(FPSMeter.FPS_UPDATE));
      _fps = 0;
    }
    
    /**
     * Called on every EnterFrame event.
     * @private
     */
    private function onEnterFrame(event:Event):void
    {
      _fps++;
    }
  }
}