1  /**
     2   * com.sekati.events.FramePulse
     3   * @version 1.1.0
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   */
     8  
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.core.FWDepth;
    11  import com.sekati.events.IPulsable;
    12  import com.sekati.utils.ClassUtils;
    13  import com.sekati.utils.Delegate;
    14  
    15  /**
    16   * Framerate FramePulse Broadcaster
    17   */
    18  class com.sekati.events.FramePulse extends CoreObject implements IPulsable {
    19  
    20  	// AsBroadcaster stubs
    21  	private var addListener:Function;
    22  	private var removeListener:Function;
    23  	private var broadcastMessage:Function;
    24  	private var _listeners:Array;
    25  	private static var _instance:FramePulse;
    26  	private var _mc:MovieClip;
    27  	private var _f:Function;
    28  	public static var onEnterFrameEVENT:String = "_onEnterFrame";
    29  
    30  	/**
    31  	 * Singleton Private Constructor: initializes centralized management of mx.events.EventDispatcher
    32  	 */
    33  	private function FramePulse() {
    34  		AsBroadcaster.initialize( this );
    35  		_mc = ClassUtils.createEmptyMovieClip( com.sekati.display.BaseClip, _root, "___FramePulse", {_depth:FWDepth.FramePulse} );
    36  		_f = Delegate.create( this, broadcastMessage, onEnterFrameEVENT );
    37  	}
    38  
    39  	/**
    40  	 * Singleton Accessor
    41  	 * @return Dispatcher
    42  	 */
    43  	public static function getInstance():FramePulse {
    44  		if (!_instance) _instance = new FramePulse( );
    45  		return _instance;
    46  	}
    47  
    48  	/**
    49  	 * Shorthand singleton accessor getter
    50  	 */
    51  	public static function get $():FramePulse {
    52  		return FramePulse.getInstance( );	
    53  	}
    54  
    55  	/**
    56  	 * Start OEF FramePulse
    57  	 * @return Void
    58  	 */
    59  	public function start():Void {
    60  		_mc.onEnterFrame = _f;		
    61  	}	
    62  
    63  	/**
    64  	 * Stop OEF FramePulse
    65  	 */
    66  	public function stop():Void {
    67  		_mc.onEnterFrame = null;
    68  	}
    69  
    70  	/**
    71  	 * Check if OEF FramePulse is running
    72  	 * @return Boolean
    73  	 */
    74  	public function isRunning():Boolean {
    75  		return _mc.onEnterFrame == _f;
    76  	}	
    77  
    78  	/**
    79  	 * Add a FramePulse listener and auto-start FramePulse if not running
    80  	 * @param o (Object) to register
    81  	 * @return Void
    82  	 */
    83  	public function addFrameListener(o:Object):Void {
    84  		if (_listeners.length < 1) start( );
    85  		addListener( o );
    86  	}
    87  
    88  	/**
    89  	 * Add an array of FramePulse listeners
    90  	 * @param a (Array) of objects to register
    91  	 * @return Void
    92  	 */
    93  	public function addFrameListeners(a:Array):Void {
    94  		for(var i:Number = 0; i < a.length ; i++) {
    95  			addFrameListener( a[i] );	
    96  		}	
    97  	}
    98  
    99  	/**
   100  	 * remove a FramePulse listener and auto-stop FramePulse if no listeners remain
   101  	 * @param o (Object) to unregister
   102  	 * @return Void
   103  	 */
   104  	public function removeFrameListener(o:Object):Void {
   105  		removeListener( o );
   106  		if (_listeners.length < 1) stop( );
   107  	}
   108  
   109  	/**
   110  	 * Remove an array of FramePulse listeners
   111  	 * @param a (Array) of objects to unregister
   112  	 * @return Void
   113  	 */
   114  	public function removeFrameListeners(a:Array):Void {
   115  		for(var i:Number = 0; i < a.length ; i++) {
   116  			removeFrameListener( a[i] );	
   117  		}	
   118  	}
   119  
   120  	/**
   121  	 * check is a FramePulse listener is registered
   122  	 * @return Boolean
   123  	 */
   124  	public function isListenerRegistered(o:Object):Boolean {
   125  		for (var i in _listeners) if(_listeners[i] === o) return true;
   126  		return false;
   127  	}
   128  
   129  	/**
   130  	 * Destroy OEF FramePulse
   131  	 * @return Void
   132  	 */
   133  	public function destroy():Void {
   134  		_instance.stop( );
   135  		_mc.destroy( );
   136  		delete _instance;
   137  		super.destroy( );
   138  	}	
   139  }