docs: function cache (signature, cache) {
      // validate signature
      var signature = getValidSignature(signature)
      // make sure cache is object
      cache = requireValidOptionalObject(cache)
      // create cache entry for module if it does not exist
      if (!defined(immutable.caches[signature.moduleName])) {
          immutable.caches[signature.moduleName] = {}
      }
      var moduleCaches = immutable.caches[signature.moduleName]
      // throw error if attempting to add multiple caching rules to the same method
      if (defined(moduleCaches[signature.methodName]) && !immutable.defaultAllowOverride) {
          throw new Error('cache error: cache rule already defined for '+signature)
      }
      // add caching rule
      moduleCaches[signature.methodName] = {
          cached: false,
          cache: cache,
      }
      // cache method if it exists
      doCacheForMethod(signature.signature)
      // return immutable
      return ImmutableCore
  }