code: func Models(in interface{}) []Model {
  	typ := reflect.TypeOf(in)
  	if !typeIsSliceOrArray(typ) {
  		msg := fmt.Sprintf("zoom: panic in Models() - attempt to convert invalid type %T to []Model.\nArgument must be slice or array.", in)
  		panic(msg)
  	}
  	elemTyp := typ.Elem()
  	if !typeIsPointerToStruct(elemTyp) {
  		msg := fmt.Sprintf("zoom: panic in Models() - attempt to convert invalid type %T to []Model.\nSlice or array must have elements of type pointer to struct.", in)
  		panic(msg)
  	}
  	val := reflect.ValueOf(in)
  	length := val.Len()
  	results := make([]Model, length)
  	for i := 0; i < length; i++ {
  		elemVal := val.Index(i)
  		model, ok := elemVal.Interface().(Model)
  		if !ok {
  			msg := fmt.Sprintf("zoom: panic in Models() - cannot convert type %T to Model", elemVal.Interface())
  			panic(msg)
  		}
  		results[i] = model
  	}
  	return results
  }
docs: // Models converts in to []Model. It will panic if the underlying type
  // of in is not a slice of some concrete type which implements Model.