smoke
=====

A concise Publish/Subscribe utility module. It supports both free-form signal
names and a stricter style where signals are declared first. You can also mix
them.

usage
-----

.. code::

    import smoke

    class MyCls(smoke.Broker):
        appears = smoke.signal('appears')
        leaves = smoke.signal('leaves')

    def say_hello(what):
        print("hello %s" % (what,))

    def say_goodbye(what):
        print("good bye %s" % (what,))

    o = MyCls()

    # Using broker
    o.subscribe("appears", say_hello)
    o.publish("appears", what='world')
    
    # Using declared signals
    o.leaves.subscribe(say_goodbye)
    o.leaves.publish(what='world')
