module.exports = ensnare // creates a proxy object that calls cb everytime the obj's properties/fns are accessed function ensnare(obj, cb){ var proxy = {} Object.keys(obj).forEach(function(key){ var val = obj[key] switch (typeof val) { case 'function': proxy[key] = function(){ cb() val.apply(obj, arguments) } return default: Object.defineProperty(proxy, key, { get: function(){ cb(); return obj[key] }, set: function(val){ cb(); return obj[key] = val }, }) return } }) return proxy }