Loads the modules associated to each filter and returns an array of middlewares.

@private
@param  {Array} filters Array with filters configuration
@returns {Array<object>} Array with filter's configuration plus a middleware
object referencing the loaded filter's module.
function loadMiddlewareFilters(filters) {

  var result = [],
      index,
      num = filters.length,
      filter,
      modulePath,
      middleware;

  function startsWith(string, searchString, position) {
    position = position || 0;
    return string.indexOf(searchString, position) === position;
  }

  for (index = 0; index < num; index++ ) {
    filter = filters[index];

    // Check filter has required properties
    if (!filter.id) {
      throw new InvalidConfiguration(InvalidConfiguration.INVALID_FILTER_MESSAGE + " Filter at index " + index + " has no 'id' property.");
    }
    if (!filter.path) {
      throw new InvalidConfiguration(InvalidConfiguration.INVALID_FILTER_MESSAGE + " Filter at index " + index + " has no 'path' property.");
    }

    // Determine module path depending on if it must be loaded from 'filters' folder
    // or node modules.
    modulePath = filter.path;
    if (startsWith(filter.path, ".")) {
      modulePath = path.join(basePath, filter.path);
    }

    // Load filter module and initialize middleware filter
    middleware = require(modulePath).init(filter.id, filter.config);

    result.push({
      id: filter.id,
      path: modulePath,
      config: filter.config,
      middleware: middleware
    });
  }

  return result;
}