engine = function(template, data, opts) {
    var that = this;

    // instead of a wrapper
    // if(!that || !(that instanceof engine)) return new engine(template, data, opts);

    that.data = util.parseData(data);
    that.opts = util.extend({

        // begin delimiter
        delimiterBegin: "{{"

        // end delimiter
        , delimiterEnd: "}}"

        // remove line breaks
        , removeLineBreaks: false
    }, opts);

    // extend
    util.extend(util, that.opts.util);
    util.extend(helper, that.opts.helper);
    util.extend(filter, that.opts.filter);

    // walkers
    that.walkers = {
        "/": "close"
        , "#": "block"
        // , "*": "comments"
        , "{": "unescape"
        // , "@": "index"
    }

    // keywords
    that.keywords = util.arrTobj("else break contiue".split(" "));

    // Abstract syntax tree
    that.ast = {};
    that.cache = {};

    that.tokenStack = [];
    that.tpl = util.fetchTpl(template);
    that.tokenId = 0;

    that.tokenReg = new RegExp(that.opts.delimiterBegin + "(((?!" + that.opts.delimiterEnd + ")[\\s\\S])*)" + that.opts.delimiterEnd, "g");

    that.commentReg = new RegExp(that.opts.delimiterBegin + "\\s*\\*[\\S\\s]*?\\*\\s*" + that.opts.delimiterEnd, "g");

    that

        // SETUP1 pre-handle
        .preCompile()

        // SETUP2 make AST
        .astWalker()

        // SETUP3 compile
        .compile();

    // console.log(JSON.stringify(that.ast, null, "    "));

    return that.data ? that.tpl : that.ast;
}
Remove line breaks
@param  {[String]} str [description]
@return {[String]}     [description]