func (c Chain) Provide(value interface{}) Chain {
	if value == nil {
		panicf("Provide(nil) is not allowed -- " +
			"did you mean to use ProvideAs(val, (*IFace)(nil))?")
	}
	return c.with(step{tVALUE, reflect.ValueOf(value), reflect.TypeOf(value)})
}
Provide an immediate value.  This cannot be used to provide an interface,
instead use ProvideAs(...) or With(...) with a function that returns the
interface.
package chain
import (
	"bytes"
	"fmt"
	"log"
	"reflect"
	"runtime"
	"sort"
	"strings"
	"text/tabwriter"
)
var errorType = reflect.TypeOf((*error)(nil)).Elem()
var DefaultErrorHandler interface{} = func(err error) {
	log.Printf("Unhandled error: %v", err)
}
type Chain struct{ steps []step }
type step struct {
	typ stepType
	val reflect.Value
	valTyp reflect.Type
}
type stepType uint8
const (
	tRESERVE stepType = iota
	tVALUE
	tPRE_HANDLER   
	tPOST_HANDLER  
	tERROR_HANDLER
)
func (c Chain) with(steps ...step) Chain {
	s := make([]step, 0, len(c.steps)+len(steps))
	s = append(s, c.steps...)
	s = append(s, steps...)
	return Chain{s}
}
func (c Chain) Reserve(typePtr interface{}) Chain {
	typ := reflect.TypeOf(typePtr)
	if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Interface {
		typ = typ.Elem()
	}
	return c.with(step{tRESERVE, reflect.Value{}, typ})
}