docs: function buildField (args, field, form, model, schema, isArrayField) {
      // create field title from schema or property name
      var title = schema && schema.title
          ? schema.title
          : changeCase.titleCase(field.property)
      // set field title
      field.title = title
      // set label if labels are enabled
      if (form.labels && args.label !== false) {
          field.label = title
          // delete so wont be merged over placeholder
          if (args.label === true) {
              delete args.label
          }
      }
      // set placeholder if placeholders enabled
      if (form.placeholders || args.placeholder !== false) {
          field.placeholder = title
          // delete so wont be merged over placeholder
          if (args.placeholder === true) {
              delete args.placeholder
          }
      }
      // set immutable property on field - field will be disabled/readonly after
      // initial value is set
      if (model.columns[field.property] && model.columns[field.property].immutable) {
          field.immutable = true
      }
      // if property has schema then use schema to populate default values
      if (schema) {
          // if schema is an array then need to create sub fields for elements
          if (schema.type === 'array') {
              // do not allow nested arrays
              assert.ok(!isArrayField, 'nested arrays not supported')
              // build field that is array of fields
              return buildArrayField(args, field, form, model, schema)
          }
          // if schema has enum then default to select type
          else if (schema.enum) {
              field.inputType = 'select'
              field.options = _.map(schema.enum, value => {
                  // by default use enum values as both key and value
                  var option = {
                      title: value,
                      value: value,
                  }
                  // set selected flag for default value
                  if (schema.default && schema.default === value) {
                      option.selected = true
                  }
                  return option
              })
          }
          // if value is boolean then default to checkbox
          else if (schema.type === 'boolean') {
              field.inputType = 'checkbox'
              // set default value
              field.value = schema.default
          }
          // otherwise use text
          else {
              field.inputType = 'text'
              // set default value
              field.value = schema.default
          }
          // if schema has pattern apply to field
          if (schema.pattern) {
              field.pattern = schema.pattern
          }
          // use schema description
          field.description = schema.description
          // store schema type on field since multiple schema types may map
          // to the same input type but need to be handled differently
          field.schemaType = schema.type
      }
      // property does not have schema
      else {
          // if property does not have schema then it must have input type
          assert.ok(inputTypes[args.inputType], `field without schema must have inputType ${model.name} ${field.property}`)
      }
      // set id for input
      field.id = model.path+'-'+field.property
      // set name for input as the modelName[property]
      field.name = model.name+'['+field.property+']'
      // merge args over default set for field
      _.merge(field, args)
      // if ckeditor flag is set on field then set for form
      if (field.ckeditor) {
          form.ckeditor = true
      }
      // return built field
      return field
  }