docs: function initModelList (args) {
      var controller = this
      var model = this.model
      // make sure args is object
      args = requireValidOptionalObject(args)
      // make sure list is defined
      args.list = requireValidOptionalObject(args.list)
      // make sure query args are object
      var queryArgs = requireValidOptionalObject(args.list.query)
      // create title from name
      var title = model.title+' Records'
      // create new form instance configured to submit from list page
      if (controller.form && _.get(args, 'list.form') !== false) {
          var form = controller.form.newInstance({
              action: './?redirect=./',
          })
      }
      // get role
      var role = args.defaultRole || 'all'
      // build fields for table view
      this.fields = buildFields(model, args.list && args.list.fields)
      // index inputs
      var input = {
          // included deleted records
          deleted: 'query.deleted',
          // limit - overrides value in query if any
          limit: 'query.limit',
          // offset - overrides value in query if any
          offset: 'query.offset',
          // column to sort by
          orderColumn: 'query.orderColumn',
          // direction to sort in
          orderDirection: 'query.orderDirection',
          // free-form search string
          search: 'query.search',
          // list of columns to select
          select: 'query.select',
          // json encoded where arguments
          where: 'query.where',
      }
      // if model has an original id column then add to query options
      if (model.columnName('originalId')) {
          input.originalId = 'query.originalId'
      }
      // add extra columns as query param options
      _.each(model.extraColumns, (spec, name) => {
          // only add column if it has index
          if (!spec.index && !spec.unique) {
              return
          }
          // do not overwrite core inputs
          if (input[name]) {
              return
          }
          // add column to inputs
          input[name] = 'query.'+name
      })
      // links to display at top of page
      var links
      // use links from list view
      if (Array.isArray(args.list.links)) {
          links = args.list.links
      }
      // use global controller links
      else if (Array.isArray(args.links)) {
          links = args.links
      }
      // set default links
      else {
          links = [
              {href: './new', title: 'Create New'},
          ]
      }
      // create path if it does not exist
      if (!this.paths['/']) {
          this.paths['/'] = {}
      }
      // add list handler for GET on /
      this.paths['/'].get = [
          {
              before: function (args) {
                  // load records
                  return beforeList(controller, args, _.cloneDeep(controller.fields), title, form, links, queryArgs)
              },
              input: input,
              method: function (args) {
                  return args.json
                      ? _.pick(args, ['records', 'result'])
                      : _.pick(args, ['clear', 'fields', 'form', 'links', 'pager', 'query', 'records', 'result', 'title'])
              },
              methodName: 'list',
              role: role,
          },
      ]
  }