package orm

import (
	
	
)

var errorType = reflect.TypeOf((*error)(nil)).Elem()

type funcModel struct {
	Model
	fnv  reflect.Value
	fnIn []reflect.Value
}

var _ Model = (*funcModel)(nil)

func ( interface{}) *funcModel {
	 := &funcModel{
		fnv: reflect.ValueOf(),
	}

	 := .fnv.Type()
	if .Kind() != reflect.Func {
		panic(fmt.Errorf("ForEach expects a %s, got a %s",
			reflect.Func, .Kind()))
	}

	if .NumIn() < 1 {
		panic(fmt.Errorf("ForEach expects at least 1 arg, got %d", .NumIn()))
	}

	if .NumOut() != 1 {
		panic(fmt.Errorf("ForEach must return 1 error value, got %d", .NumOut()))
	}
	if .Out(0) != errorType {
		panic(fmt.Errorf("ForEach must return an error, got %T", .Out(0)))
	}

	if .NumIn() > 1 {
		initFuncModelScan(, )
		return 
	}

	 := .In(0)
	var  reflect.Value
	if .Kind() == reflect.Ptr {
		 = .Elem()
		 = reflect.New()
	} else {
		 = reflect.New().Elem()
	}

	.fnIn = []reflect.Value{}

	,  := .Interface().(Model)
	if  {
		.Model = 
		return 
	}

	if .Kind() == reflect.Ptr {
		 = .Elem()
	}
	if .Kind() != reflect.Struct {
		panic(fmt.Errorf("ForEach accepts a %s, got %s",
			reflect.Struct, .Kind()))
	}
	.Model = newStructTableModelValue()

	return 
}

func ( *funcModel,  reflect.Type) {
	.fnIn = make([]reflect.Value, .NumIn())
	for  := 0;  < .NumIn(); ++ {
		.fnIn[] = reflect.New(.In()).Elem()
	}
	.Model = scanReflectValues(.fnIn)
}

func ( *funcModel) ( ColumnScanner) error {
	 := .fnv.Call(.fnIn)
	 := [0]
	if !.IsNil() {
		return .Interface().(error)
	}
	return nil
}