code: func newStorer(dataType interface{}) Storer {
  	s, ok := dataType.(Storer)
  
  	if ok {
  		return s
  	}
  
  	tp := reflect.TypeOf(dataType)
  
  	for tp.Kind() == reflect.Ptr {
  		tp = tp.Elem()
  	}
  
  	storer := &anonStorer{
  		rType:   tp,
  		indexes: make(map[string]Index),
  	}
  
  	if storer.rType.Name() == "" {
  		panic("Invalid Type for Storer.  Type is unnamed")
  	}
  
  	if storer.rType.Kind() != reflect.Struct {
  		panic("Invalid Type for Storer.  BoltHold only works with structs")
  	}
  
  	for i := 0; i < storer.rType.NumField(); i++ {
  		if strings.Contains(string(storer.rType.Field(i).Tag), BoltholdIndexTag) {
  			indexName := storer.rType.Field(i).Tag.Get(BoltholdIndexTag)
  
  			if indexName != "" {
  				indexName = storer.rType.Field(i).Name
  			}
  
  			storer.indexes[indexName] = func(name string, value interface{}) ([]byte, error) {
  				tp := reflect.ValueOf(value)
  				for tp.Kind() == reflect.Ptr {
  					tp = tp.Elem()
  				}
  
  				return encode(tp.FieldByName(name).Interface())
  			}
  		}
  	}
  
  	return storer
  }
docs: // newStorer creates a type which satisfies the Storer interface based on reflection of the passed in dataType
  // if the Type doesn't meet the requirements of a Storer (i.e. doesn't have a name) it panics
  // You can avoid any reflection costs, by implementing the Storer interface on a type