Machina Integration With Monologue v2

by ifandelse

HTML

<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://raw.github.com/ifandelse/monologue.js/master/lib/browser/monologue.js"></script>
<script src="https://raw.github.com/ifandelse/machina.js/mono/lib/browser/machina.js"></script>

JavaScript

(function(Monologue, machina) {
    var slice = Array.prototype.slice;
    
    Monologue.makeEmitter(machina.Fsm);

    var oldEmit = machina.Fsm.prototype.emit;

    machina.Fsm.prototype.emit = function() {
        var args = slice.call(arguments, 1);
        var topic = arguments[0];
        var mapper = this.payloadMapper && this.payloadMapper[topic];
        var payload = args;
        if (mapper) {
            payload = mapper.apply(this, args);
        }
        oldEmit.call(this, topic, payload);
    };

}(Monologue, machina));

var Fsm = machina.Fsm.extend({
    states: {
        uninitialized: {
            start: function() {
                this.transition("started");
            }
        },
        started: {
            finish: function() {
                this.transition("finished");
            }
        },
        finished: {
            _onEnter: function() {
                this.emit("custom.event", "Hai", new Date());
                this.handle("doMoreStuff", 1, true, "hai");
            },
            doMoreStuff: function() {
                this.deferUntilTransition("started");
            }
        }
    }
});

var instance = new Fsm();

instance.on("#", function(d, e) {
    $('body').append("<div><pre>" + JSON.stringify(e, null, 4) + "</pre></div>");
});

instance.handle("start");
instance.handle("finish");