code: func ArrayOf(v interface{}, dsl ...func()) *design.Array {
  	t := resolveType(v)
  	// never return nil to avoid panics, errors are reported after DSL execution
  	res := &design.Array{ElemType: &design.AttributeDefinition{Type: design.String}}
  	if t == nil {
  		dslengine.ReportError("invalid ArrayOf argument: not a type and not a known user type name")
  		return res
  	}
  	if len(dsl) > 1 {
  		dslengine.ReportError("ArrayOf: too many arguments")
  		return res
  	}
  	at := design.AttributeDefinition{Type: t}
  	if len(dsl) == 1 {
  		dslengine.Execute(dsl[0], &at)
  	}
  	return &design.Array{ElemType: &at}
  }
docs: // ArrayOf creates an array type from its element type. The result can be used
  // anywhere a type can. Examples:
  //
  //	var Bottle = Type("bottle", func() {
  //		Attribute("name")
  //	})
  //
  //	Action("update", func() {
  //		Params(func() {
  //			Param("ids", ArrayOf(Integer))
  //		})
  //		Payload(ArrayOf(Bottle))
  //	})
  //
  // ArrayOf accepts an optional DSL as second argument which allows providing
  // validations for the elements of the array:
  //
  //	Action("update", func() {
  //		Params(func() {
  //			Param("ids", ArrayOf(Integer, func() {
  //				Minimum(1)
  //			}))
  //		})
  //		Payload(ArrayOf(Bottle))
  //	})
  //
  // If you are looking to return a collection of elements in a Response clause,
  // refer to CollectionOf. ArrayOf creates a type, where CollectionOf creates a
  // media type.