module.exports = function(){ var async = require("async"); var actions = {}; var filters = {}; function add_action(actionname, actionfunction, priority) { var prio = priority || 10; actions[actionname] = actions[actionname] || []; actions[actionname].push([prio, actionfunction]); actions[actionname].sort(function(a, b) { return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0; }) } var actions_applied = {}; function do_action(actionname) { actions_applied[actionname] = (actions_applied[actionname] || 0) + 1; var args = Array.prototype.slice.apply(arguments, [1]); if (actions[actionname]) { return actions[actionname].map(function(arr) { var pri = arr[0]; var func = arr[1]; return func.apply({}, args); }) } } function add_filters (filtername, filterfunction, priority, filterinstancenamed) { filters[filtername] = filters[filtername] || []; if (typeof(priority) === "string" && typeof(filterinstancenamed) === "undefined") { filterinstancenamed = priority; priority = 10; } if (filterinstancenamed) { var cindex = filters[filtername].length; filters[filtername].map(function(filter, index) { if (filter[2] === filterinstancenamed) { cindex = index; } }) filters[filtername][cindex] = [priority || 0, filterfunction, filterinstancenamed]; } else { var cename = ""; filters[filtername].push([priority || 0, filterfunction, cename]); } filters[filtername].sort(function(a, b) { return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0; }) } var filters_applied = {}; function apply_filters(filtername, val) { var restargs = Array.prototype.slice.call(arguments, 2); filters_applied[filtername] = (filters_applied[filtername] || 0) + 1; // var oval = $lib._.clone(val); //$lib.log("apply_filters", filtername, "M:" + (filters[filtername] || []).length); if (filters[filtername]) { var index = 0, mindex = filters[filtername].length; while (index < mindex) { val = filters[filtername][index][1].apply(filters[filtername][index][1], [val].concat(restargs)); index++; } } return val; } function apply_filters_map(filtername) { var restargs = Array.prototype.slice.call(arguments, 1); var cb = restargs.pop(); var arr = []; if (typeof(filtername) === "object") { filtername.map(function(name) { arr = arr.concat(apply_filters(name, [])); }) } else { arr = apply_filters(filtername, []); } console.log("AAAAAAAAAAAAAAAAAAAAAAAAA",filtername); console.log("AAAAAAAAAAAAAAAAAAAAAAAAA",arr); console.log("AAAAAAAAAAAAAAAAAAAAAAAAA",restargs); async.mapSeries(arr, function(func, next) { func.apply(func, restargs.concat(next)); }, cb) } return { add_action: add_action, do_action: do_action, add_filters: add_filters, apply_filters: apply_filters, apply_filters_map: apply_filters_map }; }