text: 'use strict';
  
  const methods = require('methods').map(method => {
    return method.toUpperCase();
  });
  
  module.exports = options => {
    options = options || {};
    options.allowedMethods = options.allowedMethods || [ 'POST' ];
  
    return function overrideMethod(ctx, next) {
      const orginalMethod = ctx.request.method;
      if (options.allowedMethods.indexOf(orginalMethod) === -1) return next();
  
      let method;
      // body support
      const body = ctx.request.body;
      if (body && body._method) {
        method = body._method.toUpperCase();
      } else {
        // header support
        const header = ctx.get('x-http-method-override');
        if (header) {
          method = header.toUpperCase();
        }
      }
  
      if (method) {
        // only allow supported methods
        // if you want to support other methods,
        // just create your own utility!
        if (methods.indexOf(method) === -1) {
          ctx.throw(400, `invalid overriden method: "${method}"`);
        }
        ctx.request.method = method;
      }
  
      return next();
    };
  };
  