code: func IsZero(s interface{}) bool {
  	if s == nil {
  		return true
  	}
  
  	sv, err := structValue(s)
  	if err != nil {
  		return false
  	}
  
  	fields := modelFields(sv)
  
  	for _, f := range fields {
  		fv := sv.FieldByName(f.Name)
  		tag := newTag(f.Tag.Get(TagName))
  
  		if tag.isOmitField() {
  			continue
  		}
  
  		// embedded or nested struct
  		if isStruct(fv) {
  			// check type is in NoTraverseTypeList or has 'notraverse' tag option
  			if isNoTraverseType(fv) || tag.isNoTraverse() {
  
  				// not traversing inside, but evaluating a value
  				if !isFieldZero(fv) {
  					return false
  				}
  
  				continue
  			}
  
  			if !IsZero(fv.Interface()) {
  				return false
  			}
  
  			continue
  		}
  
  		if !isFieldZero(fv) {
  			return false
  		}
  	}
  
  	return true
  }
docs: // IsZero method returns `true` if all the exported fields in a given `struct`
  // are zero value otherwise `false`. If input is not a struct, method returns `false`.
  //
  // A "model" tag with the value of "-" is ignored by library for processing.
  // 		Example:
  //
  // 		// Field is ignored by go-model processing
  // 		BookCount	int	`model:"-"`
  // 		BookCode	string	`model:"-"`
  //
  // A "model" tag value with the option of "notraverse"; library will not traverse
  // inside the struct object. However, the field value will be evaluated whether
  // it's zero value or not.
  // 		Example:
  //
  // 		// Field is not traversed but value is evaluated/processed
  // 		ArchiveInfo	BookArchive	`model:"archiveInfo,notraverse"`
  // 		Region		BookLocale	`model:",notraverse"`
  //