// Generated by CoffeeScript 1.12.7 (function() { var Promise, base, definePromiseProperty, i, len, proxyAll, proxyBuilder, ref, synchronize, slice = [].slice; Promise = global.Promise || require("bluebird"); module.exports = Promise; if (!Promise.promisify) { Promise.promisify = function(asyncFn, context) { return function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; args = Array.prototype.slice.apply(args); return new Promise(function(resolve, reject) { args.push(function() { var err, rets; err = arguments[0], rets = 2 <= arguments.length ? slice.call(arguments, 1) : []; if (err) { return reject(err); } else { return resolve.apply(context, rets); } }); return asyncFn.apply(context, args); }); }; }; } synchronize = function(asyncFn) { return function() { var args, fnThis; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; fnThis = this === asyncFn && global || this; return Promise.promisify(asyncFn, fnThis).apply(fnThis, args); }; }; proxyAll = function(src, target, proxyFn) { var fn, i, key, len, ref; ref = Object.keys(src); fn = function(key) { if (Object.prototype[key] != null) { return; } if (Object.getOwnPropertyDescriptor(src, key).get != null) { return; } if (typeof src[key] !== 'function') { return; } return target[key] = proxyFn(key); }; for (i = 0, len = ref.length; i < len; i++) { key = ref[i]; fn(key); } return target; }; proxyBuilder = function(that) { var func, result; result = typeof that === 'function' ? (func = synchronize(that), Object.getPrototypeOf(that) !== Function.prototype ? func.__proto__ = Object.getPrototypeOf(that).promise : void 0, func) : Object.create(Object.getPrototypeOf(that) && Object.getPrototypeOf(that).promise || Object.prototype); result.that = that; proxyAll(that, result, function(key) { return function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.that[key].promise.apply(this.that, args); }; }); return result; }; definePromiseProperty = function(target, factory) { var cacheKey; if (target.hasOwnProperty("promise")) { return; } cacheKey = "__songbird__"; return Object.defineProperty(target, "promise", { enumerable: false, set: function(value) { delete this[cacheKey]; return Object.defineProperty(this, "promise", { value: value, writable: true, configurable: true, enumerable: true }); }, get: function() { if (!(Object.prototype.hasOwnProperty.call(this, cacheKey) && this[cacheKey])) { Object.defineProperty(this, cacheKey, { value: factory(this), writable: true, configurable: true, enumerable: false }); } return this[cacheKey]; } }); }; ref = [Object.prototype, Function.prototype]; for (i = 0, len = ref.length; i < len; i++) { base = ref[i]; definePromiseProperty(base, proxyBuilder); } }).call(this);