Operator overloading question (cloning).
"use strict"; "use restrict";
var Shaper = Shaper || require("shaper.js") || Shaper;
Shaper("op-overloading", function(root) {
    var prefix = 'ops.';
    var ops = {
        '+': 'add',
        '-': 'sub',
        '/': 'div',
        '*': 'mul'
    };
    var exprs = function() {
        var ret = [];
        
        for(var op in ops) {
            var func = ops[op];
            
            ret.push({
                from: Shaper.parseExpression('$ ' + op + ' $'),
                to: Shaper.parseExpression(prefix + func + '($, $)')
            });
        }
        
        return ret;
    }();
    
    return Shaper.traverseTree(root, {
        pre: function(node, ref) {
            for(var i = 0; i < exprs.length; i++) {
                var expr = exprs[i];
                
                if(Shaper.match(expr.from, node)) {
                    var call = expr.to;
                    // XXXXX: need to clone call somehow since it mutates the original object now
                    // Is there some nice way to do this?
                    Shaper.replace(call, node.children[0], node.children[1]);
                    Shaper.cloneComments(call, node);
                    return ref.set(call);
                }
            }       
        }
    });
});