| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | 
							- "use strict";
 
- var cr = Object.create;
 
- if (cr) {
 
-     var callerCache = cr(null);
 
-     var getterCache = cr(null);
 
-     callerCache[" size"] = getterCache[" size"] = 0;
 
- }
 
- module.exports = function(Promise) {
 
- var util = require("./util");
 
- var canEvaluate = util.canEvaluate;
 
- var isIdentifier = util.isIdentifier;
 
- var getMethodCaller;
 
- var getGetter;
 
- if (!false) {
 
- var makeMethodCaller = function (methodName) {
 
-     return new Function("ensureMethod", "                                    \n\
 
-         return function(obj) {                                               \n\
 
-             'use strict'                                                     \n\
 
-             var len = this.length;                                           \n\
 
-             ensureMethod(obj, 'methodName');                                 \n\
 
-             switch(len) {                                                    \n\
 
-                 case 1: return obj.methodName(this[0]);                      \n\
 
-                 case 2: return obj.methodName(this[0], this[1]);             \n\
 
-                 case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
 
-                 case 0: return obj.methodName();                             \n\
 
-                 default:                                                     \n\
 
-                     return obj.methodName.apply(obj, this);                  \n\
 
-             }                                                                \n\
 
-         };                                                                   \n\
 
-         ".replace(/methodName/g, methodName))(ensureMethod);
 
- };
 
- var makeGetter = function (propertyName) {
 
-     return new Function("obj", "                                             \n\
 
-         'use strict';                                                        \n\
 
-         return obj.propertyName;                                             \n\
 
-         ".replace("propertyName", propertyName));
 
- };
 
- var getCompiled = function(name, compiler, cache) {
 
-     var ret = cache[name];
 
-     if (typeof ret !== "function") {
 
-         if (!isIdentifier(name)) {
 
-             return null;
 
-         }
 
-         ret = compiler(name);
 
-         cache[name] = ret;
 
-         cache[" size"]++;
 
-         if (cache[" size"] > 512) {
 
-             var keys = Object.keys(cache);
 
-             for (var i = 0; i < 256; ++i) delete cache[keys[i]];
 
-             cache[" size"] = keys.length - 256;
 
-         }
 
-     }
 
-     return ret;
 
- };
 
- getMethodCaller = function(name) {
 
-     return getCompiled(name, makeMethodCaller, callerCache);
 
- };
 
- getGetter = function(name) {
 
-     return getCompiled(name, makeGetter, getterCache);
 
- };
 
- }
 
- function ensureMethod(obj, methodName) {
 
-     var fn;
 
-     if (obj != null) fn = obj[methodName];
 
-     if (typeof fn !== "function") {
 
-         var message = "Object " + util.classString(obj) + " has no method '" +
 
-             util.toString(methodName) + "'";
 
-         throw new Promise.TypeError(message);
 
-     }
 
-     return fn;
 
- }
 
- function caller(obj) {
 
-     var methodName = this.pop();
 
-     var fn = ensureMethod(obj, methodName);
 
-     return fn.apply(obj, this);
 
- }
 
- Promise.prototype.call = function (methodName) {
 
-     var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
 
-     if (!false) {
 
-         if (canEvaluate) {
 
-             var maybeCaller = getMethodCaller(methodName);
 
-             if (maybeCaller !== null) {
 
-                 return this._then(
 
-                     maybeCaller, undefined, undefined, args, undefined);
 
-             }
 
-         }
 
-     }
 
-     args.push(methodName);
 
-     return this._then(caller, undefined, undefined, args, undefined);
 
- };
 
- function namedGetter(obj) {
 
-     return obj[this];
 
- }
 
- function indexedGetter(obj) {
 
-     var index = +this;
 
-     if (index < 0) index = Math.max(0, index + obj.length);
 
-     return obj[index];
 
- }
 
- Promise.prototype.get = function (propertyName) {
 
-     var isIndex = (typeof propertyName === "number");
 
-     var getter;
 
-     if (!isIndex) {
 
-         if (canEvaluate) {
 
-             var maybeGetter = getGetter(propertyName);
 
-             getter = maybeGetter !== null ? maybeGetter : namedGetter;
 
-         } else {
 
-             getter = namedGetter;
 
-         }
 
-     } else {
 
-         getter = indexedGetter;
 
-     }
 
-     return this._then(getter, undefined, undefined, propertyName, undefined);
 
- };
 
- };
 
 
  |