text: /*!
   * body-parser
   * Copyright(c) 2014-2015 Douglas Christopher Wilson
   * MIT Licensed
   */
  
  'use strict'
  
  /**
   * Module dependencies.
   * @private
   */
  
  var deprecate = require('depd')('body-parser')
  
  /**
   * Cache of loaded parsers.
   * @private
   */
  
  var parsers = Object.create(null)
  
  /**
   * @typedef Parsers
   * @type {function}
   * @property {function} json
   * @property {function} raw
   * @property {function} text
   * @property {function} urlencoded
   */
  
  /**
   * Module exports.
   * @type {Parsers}
   */
  
  exports = module.exports = deprecate.function(bodyParser,
    'bodyParser: use individual json/urlencoded middlewares')
  
  /**
   * JSON parser.
   * @public
   */
  
  Object.defineProperty(exports, 'json', {
    configurable: true,
    enumerable: true,
    get: createParserGetter('json')
  })
  
  /**
   * Raw parser.
   * @public
   */
  
  Object.defineProperty(exports, 'raw', {
    configurable: true,
    enumerable: true,
    get: createParserGetter('raw')
  })
  
  /**
   * Text parser.
   * @public
   */
  
  Object.defineProperty(exports, 'text', {
    configurable: true,
    enumerable: true,
    get: createParserGetter('text')
  })
  
  /**
   * URL-encoded parser.
   * @public
   */
  
  Object.defineProperty(exports, 'urlencoded', {
    configurable: true,
    enumerable: true,
    get: createParserGetter('urlencoded')
  })
  
  /**
   * Create a middleware to parse json and urlencoded bodies.
   *
   * @param {object} [options]
   * @return {function}
   * @deprecated
   * @public
   */
  
  function bodyParser (options) {
    var opts = {}
  
    // exclude type option
    if (options) {
      for (var prop in options) {
        if (prop !== 'type') {
          opts[prop] = options[prop]
        }
      }
    }
  
    var _urlencoded = exports.urlencoded(opts)
    var _json = exports.json(opts)
  
    return function bodyParser (req, res, next) {
      _json(req, res, function (err) {
        if (err) return next(err)
        _urlencoded(req, res, next)
      })
    }
  }
  
  /**
   * Create a getter for loading a parser.
   * @private
   */
  
  function createParserGetter (name) {
    return function get () {
      return loadParser(name)
    }
  }
  
  /**
   * Load a parser module.
   * @private
   */
  
  function loadParser (parserName) {
    var parser = parsers[parserName]
  
    if (parser !== undefined) {
      return parser
    }
  
    // this uses a switch for static require analysis
    switch (parserName) {
      case 'json':
        parser = require('./lib/types/json')
        break
      case 'raw':
        parser = require('./lib/types/raw')
        break
      case 'text':
        parser = require('./lib/types/text')
        break
      case 'urlencoded':
        parser = require('./lib/types/urlencoded')
        break
    }
  
    // store to prevent invoking require()
    return (parsers[parserName] = parser)
  }
  