Skip to content

Instantly share code, notes, and snippets.

@leegrey
Created September 15, 2012 07:48

Revisions

  1. leegrey revised this gist Sep 20, 2012. 1 changed file with 0 additions and 5 deletions.
    5 changes: 0 additions & 5 deletions SignalHub.as
    Original file line number Diff line number Diff line change
    @@ -124,11 +124,6 @@ package com.lgrey.signal {

    }

    /*public static function defineSignal( key:*, ...types ):Signal
    {
    }*/

    //use defineSignal to create type safe signals
    public function defineSignal( key:*, ...types ):Signal
    {
  2. leegrey revised this gist Sep 19, 2012. 1 changed file with 23 additions and 23 deletions.
    46 changes: 23 additions & 23 deletions SignalHub.as
    Original 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 signalNode = SignalHub.getHub();
    var signalHub = SignalHub.getHub();
    //string key:
    var signalNode = SignalHub.getHub( 'specificNode' );
    var signalNode = SignalHub.getHub( 'ui' );
    var signalNode = SignalHub.getHub( 'soundFX' );
    var signalHub = SignalHub.getHub( 'specificHub' );
    var signalHub = SignalHub.getHub( 'ui' );
    var signalHub = SignalHub.getHub( 'soundFX' );
    //use class as key:
    var signalNode = SignalHub.getHub( MyClass );
    var signalHub = SignalHub.getHub( MyClass );
    //use instace as key:
    var signalNode = SignalHub.getHub( someInstance );
    var signalHub = SignalHub.getHub( someInstance );
    //optional Signal definition for type safety:
    signalNode.defineSignal( 'someEvent', Number, Number );
    signalHub.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' );
    var someEventSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = signalHub.getSignal( 'someEvent' );
    //add listeners:
    signalNode.add( 'someEvent', onSomeEventHandler );
    signalHub.add( 'someEvent', onSomeEventHandler );
    signalNode.addOnce( '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 = signalNode.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = signalNode.getSignal( 'someEvent' );
    var someEventSignal:Signal = signalHub.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = signalHub.getSignal( 'someEvent' );
    //dispatch through SignalHub:
    signalNode.dispatch( 'someEvent', x, y );
    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 signalNode:SignalHub = SignalHub.getHub( XYZ );
    private const signalHub:SignalHub = SignalHub.getHub( XYZ );
    public const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number );
    public const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number );
    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 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 );
    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 signalNode:SignalHub = instances[ key ];
    if( !signalNode ) signalNode = instances[ key ] = new SignalHub();
    return signalNode;
    var signalHub:SignalHub = instances[ key ];
    if( !signalHub ) signalHub = instances[ key ] = new SignalHub();
    return signalHub;
    }

    }
  3. leegrey revised this gist Sep 19, 2012. 1 changed file with 14 additions and 12 deletions.
    26 changes: 14 additions & 12 deletions SignalHub.as
    Original 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.getNode();
    var signalNode = SignalHub.getHub();
    //string key:
    var signalNode = SignalHub.getNode( 'specificNode' );
    var signalNode = SignalHub.getNode( 'ui' );
    var signalNode = SignalHub.getNode( 'soundFX' );
    var signalNode = SignalHub.getHub( 'specificNode' );
    var signalNode = SignalHub.getHub( 'ui' );
    var signalNode = SignalHub.getHub( 'soundFX' );
    //use class as key:
    var signalNode = SignalHub.getNode( MyClass );
    var signalNode = SignalHub.getHub( MyClass );
    //use instace as key:
    var signalNode = SignalHub.getNode( someInstance );
    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.getNode( instance ).add( 'someEvent', onSomeEventHandler );
    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.getNode( this ).dispatch( x, y );
    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.getNode( XYZ );
    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.getNode( XYZ ).add( 'someEvent', handler );
    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.getNode( XYZSignalGroup );
    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 );
    XYZSignals.aSignal.add( 'someEvent', handler );
    */

    package com.lgrey.signal {

    import flash.utils.Dictionary;
    import org.osflash.signals.Signal;

  4. leegrey revised this gist Sep 19, 2012. 1 changed file with 1 addition and 5 deletions.
    6 changes: 1 addition & 5 deletions SignalHub.as
    Original 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 );
    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 {
  5. leegrey renamed this gist Sep 19, 2012. 1 changed file with 27 additions and 24 deletions.
    51 changes: 27 additions & 24 deletions SignalNode.as → SignalHub.as
    Original file line number Diff line number Diff line change
    @@ -1,34 +1,34 @@

    /*
    SignalNode:
    SignalHub:
    Created on Sat 15th Sep, 2012
    by Lee Grey
    SignalNode solves the problem of object-creation order by using lazy initialisation - whoever
    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 SignalNode instances by key, or use the default instance
    // create SignalHub instances by key, or use the default instance
    //default:
    var signalNode = SignalNode.getNode();
    var signalNode = SignalHub.getNode();
    //string key:
    var signalNode = SignalNode.getNode( 'specificNode' );
    var signalNode = SignalNode.getNode( 'ui' );
    var signalNode = SignalNode.getNode( 'soundFX' );
    var signalNode = SignalHub.getNode( 'specificNode' );
    var signalNode = SignalHub.getNode( 'ui' );
    var signalNode = SignalHub.getNode( 'soundFX' );
    //use class as key:
    var signalNode = SignalNode.getNode( MyClass );
    var signalNode = SignalHub.getNode( MyClass );
    //use instace as key:
    var signalNode = SignalNode.getNode( someInstance );
    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:
    SignalNode.getNode( instance ).add( 'someEvent', onSomeEventHandler );
    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 SignalNode:
    //dispatch through SignalHub:
    signalNode.dispatch( 'someEvent', x, y );
    // dispatch the cached signal:
    someEventSignal.dispatch( x, y );
    // dispatch for a specific instance:
    SignalNode.getNode( this ).dispatch( x, y );
    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:SignalNode = SignalNode.getNode( XYZ );
    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...
    SignalNode.getNode( XYZ ).add( 'someEvent', handler );
    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:SignalNode = SignalNode.getNode( XYZSignalGroup );
    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 SignalNode {
    public class SignalHub {

    private static var instances:Dictionary = new Dictionary();

    private var signals:Dictionary = new Dictionary();

    public function SignalNode()
    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( 'SignalNode::defineSignal() - Warning, signal already existed for this key.'
    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( 'SignalNode::dispatch() - Warning, no signal with key:', key );
    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 getNode( key:* = 'defaultInstance' ):SignalNode
    public static function getHub( key:* = 'defaultInstance' ):SignalHub
    {
    var signalNode:SignalNode = instances[ key ];
    if( !signalNode ) signalNode = instances[ key ] = new SignalNode();
    var signalNode:SignalHub = instances[ key ];
    if( !signalNode ) signalNode = instances[ key ] = new SignalHub();
    return signalNode;
    }

  6. leegrey renamed this gist Sep 19, 2012. 1 changed file with 35 additions and 35 deletions.
    70 changes: 35 additions & 35 deletions Commander.as → SignalNode.as
    Original file line number Diff line number Diff line change
    @@ -1,64 +1,64 @@

    /*
    Commander:
    SignalNode:
    Created on Sat 15th Sep, 2012
    by Lee Grey
    Commander solves the problem of object-creation order by using lazy initialisation - whoever
    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 Commander instances by key, or use the default instance
    // create SignalNode instances by key, or use the default instance
    //default:
    var cmd = Commander.getInstance();
    var signalNode = SignalNode.getNode();
    //string key:
    var cmd = Commander.getInstance( 'specificCommander' );
    var cmd = Commander.getInstance( 'ui' );
    var cmd = Commander.getInstance( 'sfx' );
    var signalNode = SignalNode.getNode( 'specificNode' );
    var signalNode = SignalNode.getNode( 'ui' );
    var signalNode = SignalNode.getNode( 'soundFX' );
    //use class as key:
    var cmd = Commander.getInstance( MyClass );
    var signalNode = SignalNode.getNode( MyClass );
    //use instace as key:
    var cmd = Commander.getInstance( someInstance );
    var signalNode = SignalNode.getNode( someInstance );
    //optional Signal definition for type safety:
    cmd.defineSignal( 'someEvent', Number, Number );
    signalNode.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' );
    var someEventSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = signalNode.getSignal( 'someEvent' );
    //add listeners:
    cmd.add( 'someEvent', onSomeEventHandler );
    signalNode.add( 'someEvent', onSomeEventHandler );
    cmd.addOnce( 'someEvent', onSomeEventHandler );
    signalNode.addOnce( 'someEvent', onSomeEventHandler );
    //add listener to a particular instance:
    Commander.getInstance( instance ).add( 'someEvent', onSomeEventHandler );
    SignalNode.getNode( 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' );
    var someEventSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = signalNode.getSignal( 'someEvent' );
    //dispatch through Commander:
    cmd.dispatch( 'someEvent', x, y );
    //dispatch through SignalNode:
    signalNode.dispatch( 'someEvent', x, y );
    // dispatch the cached signal:
    someEventSignal.dispatch( x, y );
    // dispatch for a specific instance:
    Commander.getInstance( this ).dispatch( x, y );
    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 cmd:Commander = Commander.getInstance( XYZ );
    private const signalNode:SignalNode = SignalNode.getNode( XYZ );
    public const aSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number );
    public const bSignal:Signal = cmd.defineSignal( 'someOtherEvent', Number, Number );
    public const aSignal:Signal = signalNode.defineSignal( 'someEvent', Number, Number );
    public const bSignal:Signal = signalNode.defineSignal( 'someOtherEvent', Number, Number );
    }
    @@ -88,17 +88,17 @@ Usage:
    // or...
    Commander.getInstance( XYZ ).add( 'someEvent', handler );
    SignalNode.getNode( 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 );
    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 Commander {
    public class SignalNode {

    private static var instances:Dictionary = new Dictionary();

    private var signals:Dictionary = new Dictionary();

    public function Commander()
    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( 'Commander::defineSignal() - Warning, signal already existed for this key.'
    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( 'Commander::dispatch() - Warning, no signal with key:', key );
    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 getInstance( key:* = 'defaultInstance' ):Commander
    public static function getNode( key:* = 'defaultInstance' ):SignalNode
    {
    var cmd:Commander = instances[ key ];
    if( !cmd ) cmd = instances[ key ] = new Commander();
    return cmd;
    var signalNode:SignalNode = instances[ key ];
    if( !signalNode ) signalNode = instances[ key ] = new SignalNode();
    return signalNode;
    }

    }
  7. leegrey revised this gist Sep 18, 2012. 1 changed file with 82 additions and 16 deletions.
    98 changes: 82 additions & 16 deletions Commander.as
    Original 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 its creation.
    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:
    // 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( '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:
    //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 the cached signal:
    someEventSignal.dispatch( x, y );
    //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 {
    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 var Commander()
    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.' );
    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;
    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' ):void
    public function getSignal( key:* ):Signal
    {
    var signal:Signal = signals[ key ];
    if( !signal ) signal = signals[ key ] = new Signal();
    return signal;
    }

    public static function getInstance( key:* = Commander ):void
    public static function getInstance( key:* = 'defaultInstance' ):Commander
    {
    var cmd:Commander = instances[ key ];
    if( !cmd ) cmd = new Commander();
    if( !cmd ) cmd = instances[ key ] = new Commander();
    return cmd;
    }

  8. leegrey revised this gist Sep 15, 2012. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions Commander.as
    Original 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.' );
    trace( 'Commander::defineSignal() - Warning, signal already existed for'
    + 'this key. Overwriting valueClasses.' );
    } else {
    signal = signals[ key ] = new Signal();
    }
  9. leegrey revised this gist Sep 15, 2012. 1 changed file with 7 additions and 12 deletions.
    19 changes: 7 additions & 12 deletions Commander.as
    Original 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 it's creation.
    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
    // 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
    //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 crucial situations
    //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 );
    // 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 {
    @@ -81,7 +76,7 @@ package com.lgrey {
    //set / update valueClasses
    signal.valueClasses = types;

    return signal
    return signal;
    }

    public function add( key:*, closure:Function ):Signal
  10. leegrey revised this gist Sep 15, 2012. 1 changed file with 1 addition and 2 deletions.
    3 changes: 1 addition & 2 deletions Commander.as
    Original 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 crucial situations
    //Cache references to signals for performance-critical situations
    var someEventSignal:Signal = cmd.defineSignal( 'someEvent', Number, Number );
    var someEventSignal:Signal = cmd.getSignal( 'someEvent' );
  11. leegrey created this gist Sep 15, 2012.
    136 changes: 136 additions & 0 deletions Commander.as
    Original 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;
    }

    }
    }