code: func (p *Pool) refreshStruct(ctx context.Context, s interface{}) {
  	v := reflect.ValueOf(s)
  	for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {
  		v = v.Elem()
  	}
  
  	// Check if s itself is a PfconfigObject, otherwise, we cycle though its fields and process them
  	if o, ok := v.Addr().Interface().(PfconfigObject); ok {
  		FetchDecodeSocketCache(ctx, o)
  	} else {
  		for i := 0; i < v.NumField(); i++ {
  			field := v.Field(i).Addr()
  			if o, ok := field.Interface().(PfconfigObject); ok {
  				FetchDecodeSocketCache(ctx, o)
  			} else {
  				p.refreshStruct(ctx, field.Interface())
  			}
  		}
  	}
  }
docs: // Refresh a struct
  // If this struct is a PfconfigObject, it will be sent directly to FetchDecodeSocketCache
  // Otherwise, the struct fields and sub-fields will be analyzed to find all the PfconfigObjects and these will be sent to FetchDecodeSocketCache