take a closure:
var closure = (function() {
var secret = function (arg) {
return 'secret says arg is ' + arg
};
var f = function (arg) {
return 'f: ' + secret(arg)
};
return f
}());
inspect it:
var fn = closure.inspect()
Or var fn = inspect(closure);
fn.arguments []
fn.name str
fn.returns []
fn.source closure.toString()
modify it:
fn.inject('secret', function(arg) { return 'injected secret' });
call it:
var result = fn.invoke(contextData, argument);
// => result === 'f: injected secret'
Now use the insane clj pattern:
(inspect(closure)
('alias')
(function () {
expect(alias.descriptor.arguments.length).toBe(1)
}));
(inspect(closure)
('alias')
({
secret: function (arg) {
return 'injected secret'
},
expect: expect,
alias: closure
})
(function () {
expect(alias()).toBe('injected secret')
}));