code: func (cMgr *ConfigurationManager) unmarshal(rValue reflect.Value, tagName string) (err error) {
  	// handle panic
  	defer func() {
  		if r := recover(); r != nil {
  			msg := fmt.Sprintf("unmarshalling [%s] failed, err: %s", tagName, r.(error).Error())
  			err = errors.New(msg)
  			openlogging.Error(msg)
  		}
  	}()
  
  	switch rValue.Kind() {
  	case reflect.Ptr:
  		err := cMgr.handlePtr(rValue, getTagKey(tagName, doNotConsiderTag))
  		if err != nil {
  			return err
  		}
  
  	case reflect.Struct:
  		err := cMgr.handleStruct(rValue, getTagKey(tagName, doNotConsiderTag))
  		if err != nil {
  			return err
  		}
  	case reflect.Map:
  		err := cMgr.handleMap(reflect.Value{}, rValue, getTagKey(tagName, doNotConsiderTag))
  		if err != nil {
  			return err
  		}
  	case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
  		reflect.Float32, reflect.Float64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
  		reflect.Uint64, reflect.Bool, reflect.Interface, reflect.Array, reflect.Slice:
  		if rValue.CanSet() {
  			err := cMgr.setValue(rValue, tagName)
  			if err != nil {
  				return err
  			}
  		}
  	}
  
  	return nil
  }
docs: /*
     unmarshal configurations on supplied object.
     multi level configuration key structure > source.module.type.config: value
     simple key structure > config: value
  */