"""Simple sample showing basic usage pattern"""
from __future__ import print_function
from pydispatch import dispatcher

def doSomethingUseful( table, signal, sender ):
    """Sample method to receive signals"""
    print('  doSomethingUseful', repr(table), signal, sender)
def doSomethingElse( signal, **named ):
    """Sample method to receive signals

    This method demonstrates the use of the **named
    parameter, which allows a method to receive all
    remaining parameters from the send call.
    """
    print('  doSomethingElse', named)
def doDefault( ):
    """Sample method to receive All signals

    Note that this function will be registered for all
    signals from a given object.  It does not have the
    same interface as any of the other functions
    registered for those signals.  The system will
    automatically determine the appropriate calling
    signature for the function.
    """
    print('  doDefault (no arguments)')

class Node(object):
    """Sample object to send signals, note lack of dispatcher-aware code"""
    def __init__( self, name="an object" ):
        self.name = name
    def __repr__( self ):
        return "%s( %r )"%( self.__class__.__name__, self.name )

DO_LOTS = 0
DO_SOMETHING = ('THIS','IS','A','MORE','COMPLEX','SIGNAL')
DO_SOMETHING_ELSE = Node()

ourObjects = [
    Node(),
    Node(),
    Node(),
]
if __name__ == "__main__":
    # Establish some "routing" connections
    dispatcher.connect (
        doSomethingUseful,
        signal = DO_LOTS,
        sender = ourObjects[0],
    )
    dispatcher.connect (
        doSomethingElse,
        signal = DO_SOMETHING,
        sender = ourObjects[0],
    )
    dispatcher.connect(
        doDefault,
        signal = dispatcher.Any, # this is actually the default,
        sender = ourObjects[0],
    )
    print("Sending DO_LOTS from first object")
    dispatcher.send(
        signal = DO_LOTS,
        sender = ourObjects[0],
        table = "Table Argument",
    )
    print("Sending DO_SOMETHING from first object")
    dispatcher.send(
        signal = DO_SOMETHING,
        sender = ourObjects[0],
        table = "Table Argument",
    )
    print("Sending DO_SOMETHING_ELSE from first object")
    dispatcher.send(
        signal = DO_SOMETHING_ELSE,
        sender = ourObjects[0],
        table = "Table Argument",
    )