addCallListener 0.2

CSS

f1

TypeScript

Function.addCallListener = function(func, callbacks) {
    var successNumber = 0,
        errorNumber = 0,
        name = func.name;

    return function() {
        var args = [].slice.call(arguments);
        var result, error;

        var props = {
            args: args,
            self: this,
            name: name
        }


        callbacks.before && callbacks.before(props);

        try {
            result = func.apply(this, arguments);
            props.successNumber = ++successNumber;
            props.result = result;
            props.status = 'success';
            callbacks.success && callbacks.success(props);
        } catch (e) {
            props.errorNumber = ++errorNumber;
            props.error = e;
            props.status = 'error';
            callbacks.error && callbacks.error(props);
        }

        callbacks.after && callbacks.after(props);

        return result;
    }
}

f1 = function f1() {
    throw new Error('bla')
}
f1 = Function.addCallListener(f1, {
    before: function(props) {
        console.log('before', props);
    },

    success: function(props) {
        console.log('success', props);
    },
    after: function(props) {
        console.log('after', props);
    },

    error: function(props) {
        console.log('error', props);
    }
});
f1(1, 2, 3, 4, 5, 6);


f2 = function f2() {
    return 5;
}
f2 = Function.addCallListener(f2, {
    before: function(props) {
        console.log('before', props);
    },

    success: function(props) {
        console.log('success', props);
    },
    after: function(props) {
        console.log('after', props);
    },

    error: function(props) {
        console.log('error', props);
    }
});
f2(0, 9, 8, 7, 6, 5);
f2(0, 9, 8, 7, 6, 5);
f2(0, 9, 8, 7, 6, 5);