Machina Integration With Monologue v1

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/master/lib/browser/machina.js"></script>

JavaScript

(function(Monologue, machina) {
    var slice = Array.prototype.slice;
    var payloadMapper = {
        handling: function() {
            var args = slice.call(arguments, 1);
            return {
                input: arguments[0],
                args: args
            };
        },
        handled: function() {
            var args = slice.call(arguments, 1);
            return {
                input: arguments[0],
                args: args
            };
        },
        nohandler: function() {
            var args = slice.call(arguments, 1);
            return {
                input: arguments[0],
                args: args
            };
        },
        transition: function(oldState, newState) {
            return {
                oldState: oldState,
                newState: newState
            };
        },
        invalidstate: function(state, invalidState) {
            return {
                currentState: state,
                invalidState: invalidState
            };
        },
        deferred: function(state, queuedArgs) {
            var args = slice.call(arguments, 1);
            return {
                currentState: state,
                queuedArgs: queuedArgs
            };
        }
    };

    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] ?       
                        this.payloadMapper[topic] :
                        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");
            }
        },
     ...