text: const util = require('util');
  
  const methods = ['get', 'post', 'delete', 'patch', 'put'];
  // Paramable exists so we don't return a function unless we actually need one #savingmemory
  const paramable = [
    'channels', 'users', 'guilds', 'members',
    'bans', 'emojis', 'pins', 'permissions',
    'reactions', 'webhooks', 'messages',
    'notes', 'roles', 'applications',
    'invites', 'bot',
  ];
  const reflectors = ['toString', 'valueOf', 'inspect', Symbol.toPrimitive, util.inspect.custom];
  
  module.exports = restManager => {
    const handler = {
      get(list, name) {
        if (reflectors.includes(name)) return () => list.join('/');
        if (paramable.includes(name)) {
          function toReturn(...args) { // eslint-disable-line no-inner-declarations
            list = list.concat(name);
            for (const arg of args) {
              if (arg !== null && typeof arg !== 'undefined') list = list.concat(arg);
            }
            return new Proxy(list, handler);
          }
          const directJoin = () => `${list.join('/')}/${name}`;
          for (const r of reflectors) toReturn[r] = directJoin;
          for (const method of methods) {
            toReturn[method] = options => restManager.request(method, `${list.join('/')}/${name}`, options);
          }
          return toReturn;
        }
        if (methods.includes(name)) return options => restManager.request(name, list.join('/'), options);
        return new Proxy(list.concat(name), handler);
      },
    };
  
    return new Proxy([''], handler);
  };
  