Created
September 15, 2012 07:48
Revisions
-
leegrey revised this gist
Sep 20, 2012 . 1 changed file with 0 additions and 5 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -124,11 +124,6 @@ package com.lgrey.signal { } //use defineSignal to create type safe signals public function defineSignal( key:*, ...types ):Signal { -
leegrey revised this gist
Sep 19, 2012 . 1 changed file with 23 additions and 23 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -17,42 +17,42 @@ Usage: // create SignalHub instances by key, or use the default instance //default: var signalHub = SignalHub.getHub(); //string key: var signalHub = SignalHub.getHub( 'specificHub' ); var signalHub = SignalHub.getHub( 'ui' ); var signalHub = SignalHub.getHub( 'soundFX' ); //use class as key: var signalHub = SignalHub.getHub( MyClass ); //use instace as key: var signalHub = SignalHub.getHub( someInstance ); //optional Signal definition for type safety: signalHub.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance-critical situations var someEventSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = signalHub.getSignal( 'someEvent' ); //add listeners: signalHub.add( 'someEvent', onSomeEventHandler ); signalHub.addOnce( 'someEvent', onSomeEventHandler ); //add listener to a particular instance: SignalHub.getHub( instance ).add( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = signalHub.getSignal( 'someEvent' ); //dispatch through SignalHub: signalHub.dispatch( 'someEvent', x, y ); // dispatch the cached signal: someEventSignal.dispatch( x, y ); @@ -71,10 +71,10 @@ Usage: class XYZSignalGroup { //use the class XYZ as a key: private const signalHub:SignalHub = SignalHub.getHub( XYZ ); public const aSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number ); public const bSignal:Signal = signalHub.defineSignal( 'someOtherEvent', Number, Number ); } @@ -97,9 +97,9 @@ Usage: class XYZSignals { //use the class XYZSignals as a key: private static const signalHub:SignalHub = SignalHub.getHub( XYZSignalGroup ); public static const aSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number ); public static const bSignal:Signal = signalHub.defineSignal( 'someOtherEvent', Number, Number ); } //access like this: @@ -188,9 +188,9 @@ package com.lgrey.signal { public static function getHub( key:* = 'defaultInstance' ):SignalHub { var signalHub:SignalHub = instances[ key ]; if( !signalHub ) signalHub = instances[ key ] = new SignalHub(); return signalHub; } } -
leegrey revised this gist
Sep 19, 2012 . 1 changed file with 14 additions and 12 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,3 +1,4 @@ /* SignalHub: @@ -16,18 +17,18 @@ Usage: // create SignalHub instances by key, or use the default instance //default: var signalNode = SignalHub.getHub(); //string key: var signalNode = SignalHub.getHub( 'specificNode' ); var signalNode = SignalHub.getHub( 'ui' ); var signalNode = SignalHub.getHub( 'soundFX' ); //use class as key: var signalNode = SignalHub.getHub( MyClass ); //use instace as key: var signalNode = SignalHub.getHub( someInstance ); //optional Signal definition for type safety: signalNode.defineSignal( 'someEvent', Number, Number ); @@ -42,7 +43,7 @@ Usage: signalNode.addOnce( 'someEvent', onSomeEventHandler ); //add listener to a particular instance: SignalHub.getHub( instance ).add( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: @@ -57,7 +58,7 @@ Usage: someEventSignal.dispatch( x, y ); // dispatch for a specific instance: SignalHub.getHub( this ).dispatch( x, y ); Static signal groups: @@ -70,7 +71,7 @@ Usage: class XYZSignalGroup { //use the class XYZ as a key: private const signalNode:SignalHub = SignalHub.getHub( XYZ ); public const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); @@ -87,7 +88,7 @@ Usage: // or... SignalHub.getHub( XYZ ).add( 'someEvent', handler ); Note that any instance of XYZSignalGroup created will point to the same signals, no matter where or when it is created. @@ -96,18 +97,19 @@ Usage: class XYZSignals { //use the class XYZSignals as a key: private static const signalNode:SignalHub = SignalHub.getHub( XYZSignalGroup ); public static const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public static const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); } //access like this: XYZSignals.aSignal.add( 'someEvent', handler ); */ package com.lgrey.signal { import flash.utils.Dictionary; import org.osflash.signals.Signal; -
leegrey revised this gist
Sep 19, 2012 . 1 changed file with 1 addition and 5 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,4 +1,3 @@ /* SignalHub: @@ -104,11 +103,8 @@ Usage: //access like this: XYZSignals.aSignal.add( 'someEvent', handler ); */ package com.lgrey.signal { -
leegrey renamed this gist
Sep 19, 2012 . 1 changed file with 27 additions and 24 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,34 +1,34 @@ /* SignalHub: Created on Sat 15th Sep, 2012 by Lee Grey SignalHub solves the problem of object-creation order by using lazy initialisation - whoever makes the first request for a Signal with a given key will bring about it's creation. Listeners can be added to a Signal even before the dispatching class has optionally defined the type-signature of the Signal Usage: // create SignalHub instances by key, or use the default instance //default: var signalNode = SignalHub.getNode(); //string key: var signalNode = SignalHub.getNode( 'specificNode' ); var signalNode = SignalHub.getNode( 'ui' ); var signalNode = SignalHub.getNode( 'soundFX' ); //use class as key: var signalNode = SignalHub.getNode( MyClass ); //use instace as key: var signalNode = SignalHub.getNode( someInstance ); //optional Signal definition for type safety: signalNode.defineSignal( 'someEvent', Number, Number ); @@ -43,22 +43,22 @@ Usage: signalNode.addOnce( 'someEvent', onSomeEventHandler ); //add listener to a particular instance: SignalHub.getNode( instance ).add( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = signalNode.getSignal( 'someEvent' ); //dispatch through SignalHub: signalNode.dispatch( 'someEvent', x, y ); // dispatch the cached signal: someEventSignal.dispatch( x, y ); // dispatch for a specific instance: SignalHub.getNode( this ).dispatch( x, y ); Static signal groups: @@ -71,7 +71,7 @@ Usage: class XYZSignalGroup { //use the class XYZ as a key: private const signalNode:SignalHub = SignalHub.getNode( XYZ ); public const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); @@ -88,15 +88,16 @@ Usage: // or... SignalHub.getNode( XYZ ).add( 'someEvent', handler ); Note that any instance of XYZSignalGroup created will point to the same signals, no matter where or when it is created. // Alternatively, a group with static members: class XYZSignals { //use the class XYZSignals as a key: private static const signalNode:SignalHub = SignalHub.getNode( XYZSignalGroup ); public static const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public static const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); } @@ -106,19 +107,21 @@ Usage: XYZSignals.aSignal.add( 'someEvent', handler ); //If you had to rename a "SignalHub" or "SignalManager" to something cooler, what would you call it? */ package com.lgrey.signal { import flash.utils.Dictionary; import org.osflash.signals.Signal; public class SignalHub { private static var instances:Dictionary = new Dictionary(); private var signals:Dictionary = new Dictionary(); public function SignalHub() { } @@ -134,7 +137,7 @@ package com.lgrey.signal { var signal:Signal = signals[ key ]; //warn if overwriting if( signal ) { // assert( signals[ key ], 'warning....' ) trace( 'SignalHub::defineSignal() - Warning, signal already existed for this key.' + ' Overwriting valueClasses.' ); } else { signal = signals[ key ] = new Signal(); @@ -174,7 +177,7 @@ package com.lgrey.signal { { var signal:Signal = signals[ key ]; if( signal ) signal.dispatch.apply( null, args ); else trace( 'SignalHub::dispatch() - Warning, no signal with key:', key ); return signal; } @@ -185,10 +188,10 @@ package com.lgrey.signal { return signal; } public static function getHub( key:* = 'defaultInstance' ):SignalHub { var signalNode:SignalHub = instances[ key ]; if( !signalNode ) signalNode = instances[ key ] = new SignalHub(); return signalNode; } -
leegrey renamed this gist
Sep 19, 2012 . 1 changed file with 35 additions and 35 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,64 +1,64 @@ /* SignalNode: Created on Sat 15th Sep, 2012 by Lee Grey SignalNode solves the problem of object-creation order by using lazy initialisation - whoever makes the first request for a Signal with a given key will bring about it's creation. Listeners can be added to a Signal even before the dispatching class has optionally defined the type-signature of the Signal Usage: // create SignalNode instances by key, or use the default instance //default: var signalNode = SignalNode.getNode(); //string key: var signalNode = SignalNode.getNode( 'specificNode' ); var signalNode = SignalNode.getNode( 'ui' ); var signalNode = SignalNode.getNode( 'soundFX' ); //use class as key: var signalNode = SignalNode.getNode( MyClass ); //use instace as key: var signalNode = SignalNode.getNode( someInstance ); //optional Signal definition for type safety: signalNode.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance-critical situations var someEventSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = signalNode.getSignal( 'someEvent' ); //add listeners: signalNode.add( 'someEvent', onSomeEventHandler ); signalNode.addOnce( 'someEvent', onSomeEventHandler ); //add listener to a particular instance: SignalNode.getNode( instance ).add( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = signalNode.getSignal( 'someEvent' ); //dispatch through SignalNode: signalNode.dispatch( 'someEvent', x, y ); // dispatch the cached signal: someEventSignal.dispatch( x, y ); // dispatch for a specific instance: SignalNode.getNode( this ).dispatch( x, y ); Static signal groups: @@ -71,10 +71,10 @@ Usage: class XYZSignalGroup { //use the class XYZ as a key: private const signalNode:SignalNode = SignalNode.getNode( XYZ ); public const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); } @@ -88,17 +88,17 @@ Usage: // or... SignalNode.getNode( XYZ ).add( 'someEvent', handler ); // Alternatively, a group with static members: class XYZSignals { //use the class XYZSignals as a key: private static const signalNode:SignalNode = SignalNode.getNode( XYZSignalGroup ); public static const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number ); public static const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number ); } //access like this: @@ -112,13 +112,13 @@ package com.lgrey.signal { import flash.utils.Dictionary; import org.osflash.signals.Signal; public class SignalNode { private static var instances:Dictionary = new Dictionary(); private var signals:Dictionary = new Dictionary(); public function SignalNode() { } @@ -134,7 +134,7 @@ package com.lgrey.signal { var signal:Signal = signals[ key ]; //warn if overwriting if( signal ) { // assert( signals[ key ], 'warning....' ) trace( 'SignalNode::defineSignal() - Warning, signal already existed for this key.' + ' Overwriting valueClasses.' ); } else { signal = signals[ key ] = new Signal(); @@ -174,7 +174,7 @@ package com.lgrey.signal { { var signal:Signal = signals[ key ]; if( signal ) signal.dispatch.apply( null, args ); else trace( 'SignalNode::dispatch() - Warning, no signal with key:', key ); return signal; } @@ -185,11 +185,11 @@ package com.lgrey.signal { return signal; } public static function getNode( key:* = 'defaultInstance' ):SignalNode { var signalNode:SignalNode = instances[ key ]; if( !signalNode ) signalNode = instances[ key ] = new SignalNode(); return signalNode; } } -
leegrey revised this gist
Sep 18, 2012 . 1 changed file with 82 additions and 16 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,3 +1,4 @@ /* Commander: @@ -6,29 +7,33 @@ Commander: by Lee Grey Commander solves the problem of object-creation order by using lazy initialisation - whoever makes the first request for a Signal with a given key will bring about it's creation. Listeners can be added to a Signal even before the dispatching class has optionally defined the type-signature of the Signal Usage: // create Commander instances by key, or use the default instance //default: var cmd = Commander.getInstance(); //string key: var cmd = Commander.getInstance( 'specificCommander' ); var cmd = Commander.getInstance( 'ui' ); var cmd = Commander.getInstance( 'sfx' ); //use class as key: var cmd = Commander.getInstance( MyClass ); //use instace as key: var cmd = Commander.getInstance( someInstance ); //optional Signal definition for type safety: cmd.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance-critical situations var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); @@ -37,46 +42,106 @@ Usage: cmd.addOnce( 'someEvent', onSomeEventHandler ); //add listener to a particular instance: Commander.getInstance( instance ).add( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); //dispatch through Commander: cmd.dispatch( 'someEvent', x, y ); // dispatch the cached signal: someEventSignal.dispatch( x, y ); // dispatch for a specific instance: Commander.getInstance( this ).dispatch( x, y ); Static signal groups: Using statc groups ensures that signals are created and available to the application immediately //for class XYZ, create a static instance of a group of signals: class XYZSignalGroup { //use the class XYZ as a key: private const cmd:Commander = Commander.getInstance( XYZ ); public const aSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); public const bSignal:Signal = cmd.defineSignal( 'someOtherEvent', Number, Number ); } // within XYZ class: public static const signals:XYZSignalGroup = new XYZSignalGroup(); // now access signals like this: XYZ.signals.aSignal.add( 'someEvent', handler ); // or... Commander.getInstance( XYZ ).add( 'someEvent', handler ); // Alternatively, a group with static members: class XYZSignals { //use the class XYZSignals as a key: private static const cmd:Commander = Commander.getInstance( XYZSignalGroup ); public static const aSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); public static const bSignal:Signal = cmd.defineSignal( 'someOtherEvent', Number, Number ); } //access like this: XYZSignals.aSignal.add( 'someEvent', handler ); */ package com.lgrey.signal { import flash.utils.Dictionary; import org.osflash.signals.Signal; public class Commander { private static var instances:Dictionary = new Dictionary(); private var signals:Dictionary = new Dictionary(); public function Commander() { } /*public static function defineSignal( key:*, ...types ):Signal { }*/ //use defineSignal to create type safe signals public function defineSignal( key:*, ...types ):Signal { var signal:Signal = signals[ key ]; //warn if overwriting if( signal ) { // assert( signals[ key ], 'warning....' ) trace( 'Commander::defineSignal() - Warning, signal already existed for this key.' + ' Overwriting valueClasses.' ); } else { signal = signals[ key ] = new Signal(); } //set / update valueClasses signal.valueClasses = types; return signal } public function add( key:*, closure:Function ):Signal @@ -110,19 +175,20 @@ package com.lgrey { var signal:Signal = signals[ key ]; if( signal ) signal.dispatch.apply( null, args ); else trace( 'Commander::dispatch() - Warning, no signal with key:', key ); return signal; } public function getSignal( key:* ):Signal { var signal:Signal = signals[ key ]; if( !signal ) signal = signals[ key ] = new Signal(); return signal; } public static function getInstance( key:* = 'defaultInstance' ):Commander { var cmd:Commander = instances[ key ]; if( !cmd ) cmd = instances[ key ] = new Commander(); return cmd; } -
leegrey revised this gist
Sep 15, 2012 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -68,8 +68,8 @@ package com.lgrey { var signal:Signal = signals[ key ]; //warn if overwriting if( signal ) { // assert( signals[ key ], 'warning....' ) trace( 'Commander::defineSignal() - Warning, signal already existed for' + 'this key. Overwriting valueClasses.' ); } else { signal = signals[ key ] = new Signal(); } -
leegrey revised this gist
Sep 15, 2012 . 1 changed file with 7 additions and 12 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -6,14 +6,14 @@ Commander: by Lee Grey Commander solves the problem of object-creation order by using lazy initialisation - whoever makes the first request for a Signal with a given key will bring about its creation. Listeners can be added to a Signal even before the dispatching class has optionally defined the type-signature of the Signal Usage: // create Commander instances by key, or use the default instance: //default: var cmd = Commander.getInstance(); @@ -28,7 +28,7 @@ Usage: //optional Signal definition for type safety: cmd.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); @@ -37,23 +37,18 @@ Usage: cmd.addOnce( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance-critical situations: var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); // dispatch the cached signal: someEventSignal.dispatch( x, y ); //dispatch through Commander: cmd.dispatch( 'someEvent', x, y ); */ package com.lgrey { public class Commander { @@ -81,7 +76,7 @@ package com.lgrey { //set / update valueClasses signal.valueClasses = types; return signal; } public function add( key:*, closure:Function ):Signal -
leegrey revised this gist
Sep 15, 2012 . 1 changed file with 1 addition and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,4 +1,3 @@ /* Commander: @@ -29,7 +28,7 @@ Usage: //optional Signal definition for type safety: cmd.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance-critical situations var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); -
leegrey created this gist
Sep 15, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,136 @@ /* Commander: Created on Sat 15th Sep, 2012 by Lee Grey Commander solves the problem of object-creation order by using lazy initialisation - whoever makes the first request for a Signal with a given key will bring about it's creation. Listeners can be added to a Signal even before the dispatching class has optionally defined the type-signature of the Signal Usage: // create Commander instances by key, or use the default instance //default: var cmd = Commander.getInstance(); //string key: var cmd = Commander.getInstance( 'specificCommander' ); //use class as key: var cmd = Commander.getInstance( MyClass ); //optional Signal definition for type safety: cmd.defineSignal( 'someEvent', Number, Number ); //Cache references to signals for performance crucial situations var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); //add listeners: cmd.add( 'someEvent', onSomeEventHandler ); cmd.addOnce( 'someEvent', onSomeEventHandler ); //Cache references to signals for performance crucial situations var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number ); var someEventSignal:Signal = cmd.getSignal( 'someEvent' ); //dispatch through Commander: cmd.dispatch( 'someEvent', x, y ); // dispatch the cached signal someEventSignal.dispatch( x, y ); */ // Should I require defineSignal to be called first? That would give the best type safety.... package com.lgrey { public class Commander { private static var instances:Dictionary = new Dictionary(); private var signals:Dictionary = new Dictionary(); public var Commander() { } //use defineSignal to create type safe signals public function defineSignal( key:*, ...types ):Signal { var signal:Signal = signals[ key ]; //warn if overwriting if( signal ) { // assert( signals[ key ], 'warning....' ) trace( 'Commander::defineSignal() - Warning, signal already existed for this key.' + ' Overwriting valueClasses.' ); } else { signal = signals[ key ] = new Signal(); } //set / update valueClasses signal.valueClasses = types; return signal } public function add( key:*, closure:Function ):Signal { var signal:Signal = signals[ key ]; if( !signal ) signal = signals[ key ] = new Signal(); signal.add( closure ); return signal; } public function addOnce( key:*, closure:Function ):Signal { var signal:Signal = signals[ key ]; if( !signal ) signal = signals[ key ] = new Signal(); signal.addOnce( closure ); return signal; } public function remove( key:*, closure:Function ):Signal { var signal:Signal = signals[ key ]; if( signal ) signal.remove( closure ); return signal; } // using apply() results in a significant performance hit // in performance-critical situations, cache the Signal reference // returned by defineSignal() and getSignal() public function dispatch( key:*, ...args ):Signal { var signal:Signal = signals[ key ]; if( signal ) signal.dispatch.apply( null, args ); else trace( 'Commander::dispatch() - Warning, no signal with key:', key ); } public function getSignal( 'key' ):void { var signal:Signal = signals[ key ]; if( !signal ) signal = signals[ key ] = new Signal(); return signal; } public static function getInstance( key:* = Commander ):void { var cmd:Commander = instances[ key ]; if( !cmd ) cmd = new Commander(); return cmd; } } }