bindMethod = (
  methodTag,
  contextProvider,
  behaviorMethod,
  methodGuard,
) => {
  assert.typeof(behaviorMethod, 'function');

  /**
   * @param {any} representative
   * @returns {ClassContext | KitContext}
   */
  const getContext = representative => {
    representative ||
      // separate line to ease breakpointing
      Fail`Method ${methodTag} called without 'this' object`;
    const context = contextProvider(representative);
    if (context === undefined) {
      throw Fail`${q(
        methodTag,
      )} may only be applied to a valid instance: ${representative}`;
    }
    return context;
  };

  const method = defendMethod(
    getContext,
    behaviorMethod,
    methodGuard,
    methodTag,
  );

  defineProperties(method, {
    name: { value: methodTag },
    length: { value: behaviorMethod.length },
  });
  return method;
}
@param {string} methodTag
@param {ContextProvider} contextProvider
@param {CallableFunction} behaviorMethod
@param {MethodGuard} methodGuard