docs: private void init() {
          _minValue                           = 0;
          _maxValue                           = 100;
          value                               = new DoublePropertyBase(_minValue) {
              @Override protected void invalidated() {
                  final double VALUE = get();
                  withinSpeedLimit = !(Instant.now().minusMillis(getAnimationDuration()).isBefore(lastCall));
                  lastCall = Instant.now();
                  if (isAnimated() && withinSpeedLimit) {
                      long animationDuration = isReturnToZero() ? (long) (0.2 * getAnimationDuration()) : getAnimationDuration();
                      timeline.stop();
  
                      final KeyValue KEY_VALUE;
                      if (NeedleBehavior.STANDARD == getNeedleBehavior()) {
                          KEY_VALUE = new KeyValue(currentValue, VALUE, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                      } else { // Optimized only useful in a gauge where the angle range is 360 deg and the shorter way has to be calculated.
                          double ov         = getOldValue();
                          double min        = getMinValue();
                          double max        = getMaxValue();
                          double halfRange  = getRange() * 0.5;
                          double cv         = getCurrentValue();
                          double delta      = VALUE - getCurrentValue();
  
                          if (delta < -halfRange) {
                              double kv1 = max - cv;
                              double kv2 = VALUE;
                          } else if (delta > halfRange) {
  
                          }
  
                          double tmpValue;
  
                          if (Math.abs(VALUE - ov) > getRange() * 0.5) {
                              if (ov < VALUE) {
                                  tmpValue = min - max + VALUE;
                              } else {
                                  tmpValue = ov + max - ov + min + VALUE - getRange();
                              }
                              KEY_VALUE = new KeyValue(currentValue, tmpValue, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                          } else {
                              if (cv < min) currentValue.set(max + cv);
                              KEY_VALUE = new KeyValue(currentValue, VALUE, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                          }
                      }
                      final KeyFrame KEY_FRAME = new KeyFrame(Duration.millis(animationDuration), KEY_VALUE);
                      timeline.getKeyFrames().setAll(KEY_FRAME);
                      timeline.play();
                  } else {
                      currentValue.set(VALUE);
                      fireUpdateEvent(FINISHED_EVENT);
                  }
                  if (isAveragingEnabled()) { movingAverage.addData(new Data(VALUE)); }
              }
              @Override public void set(final double VALUE) {
                  super.set(VALUE);
                  fireUpdateEvent(VALUE_EVENT);
              }
              @Override public Object getBean() { return Gauge.this; }
              @Override public String getName() { return "value"; }
          };
          oldValue                            = new SimpleDoubleProperty(Gauge.this, "oldValue", value.get());
          currentValue                        = new DoublePropertyBase(value.get()) {
              @Override protected void invalidated() {
                  final double VALUE = get();
                  if (isCheckThreshold()) {
                      double thrshld = getThreshold();
                      if (formerValue.get() < thrshld && VALUE > thrshld) {
                          fireEvent(EXCEEDED_EVENT);
                      } else if (formerValue.get() > thrshld && VALUE < thrshld) {
                          fireEvent(UNDERRUN_EVENT);
                      }
                  }
                  if (VALUE < getMinMeasuredValue()) {
                      setMinMeasuredValue(VALUE);
                  } else if (VALUE > getMaxMeasuredValue()) {
                      setMaxMeasuredValue(VALUE);
                  }
                  formerValue.set(VALUE);
              }
              @Override public void set(final double VALUE) { super.set(VALUE); }
              @Override public Object getBean() { return Gauge.this; }
              @Override public String getName() { return "currentValue";}
          };
          formerValue                         = new SimpleDoubleProperty(Gauge.this, "formerValue", value.get());
          _range                              = _maxValue - _minValue;
          _threshold                          = _maxValue;
          _title                              = "";
          _subTitle                           = "";
          _unit                               = "";
          _averagingEnabled                   = false;
          _averagingPeriod                    = 10;
          movingAverage                       = new MovingAverage(_averagingPeriod);
          sections                            = FXCollections.observableArrayList();
          areas                               = FXCollections.observableArrayList();
          tickMarkSections                    = FXCollections.observableArrayList();
          tickLabelSections                   = FXCollections.observableArrayList();
          markers                             = FXCollections.observableArrayList();
  
          _startFromZero                      = false;
          _returnToZero                       = false;
          _zeroColor                          = DARK_COLOR;
          _minMeasuredValue                   = _maxValue;
          _maxMeasuredValue                   = _minValue;
          _minMeasuredValueVisible            = false;
          _maxMeasuredValueVisible            = false;
          _oldValueVisible                    = false;
          _valueVisible                       = true;
          _backgroundPaint                    = Color.TRANSPARENT;
          _borderPaint                        = Color.TRANSPARENT;
          _borderWidth                        = 1;
          _foregroundPaint                    = Color.TRANSPARENT;
          _knobColor                          = Color.rgb(204, 204, 204);
          _knobType                           = KnobType.STANDARD;
          _knobPosition                       = Pos.CENTER;
          _knobVisible                        = true;
          _animated                           = false;
          animationDuration                   = 800;
          _startAngle                         = 320;
          _angleRange                         = 280;
          _angleStep                          = _angleRange / _range;
          _autoScale                          = true;
          _shadowsEnabled                     = false;
          _barEffectEnabled                   = false;
          _scaleDirection                     = ScaleDirection.CLOCKWISE;
          _tickLabelLocation                  = TickLabelLocation.INSIDE;
          _tickLabelOrientation               = TickLabelOrientation.HORIZONTAL;
          _tickLabelColor                     = DARK_COLOR;
          _tickMarkColor                      = DARK_COLOR;
          _majorTickMarkColor                 = DARK_COLOR;
          _majorTickMarkLengthFactor          = 0.42;
          _majorTickMarkWidthFactor           = 0.275;
          _mediumTickMarkColor                = DARK_COLOR;
          _mediumTickMarkLengthFactor         = 0.41;
          _mediumTickMarkWidthFactor          = 0.175;
          _minorTickMarkColor                 = DARK_COLOR;
          _minorTickMarkLengthFactor          = 0.40;
          _minorTickMarkWidthFactor           = 0.1125;
          _majorTickMarkType                  = TickMarkType.LINE;
          _mediumTickMarkType                 = TickMarkType.LINE;
          _minorTickMarkType                  = TickMarkType.LINE;
          _locale                             = Locale.US;
          _decimals                           = 1;
          _tickLabelDecimals                  = 0;
          _needleType                         = NeedleType.STANDARD;
          _needleShape                        = NeedleShape.ANGLED;
          _needleSize                         = NeedleSize.STANDARD;
          _needleBehavior                     = NeedleBehavior.STANDARD;
          _needleColor                        = Color.rgb(200, 0, 0);
          _needleBorderColor                  = Color.TRANSPARENT;
          _barColor                           = BRIGHT_COLOR;
          _barBorderColor                     = Color.TRANSPARENT;
          _barBackgroundColor                 = DARK_COLOR;
          _lcdDesign                          = LcdDesign.STANDARD;
          _lcdFont                            = LcdFont.DIGITAL_BOLD;
          _ledColor                           = Color.RED;
          _ledType                            = LedType.STANDARD;
          _titleColor                         = DARK_COLOR;
          _subTitleColor                      = DARK_COLOR;
          _unitColor                          = DARK_COLOR;
          _valueColor                         = DARK_COLOR;
          _thresholdColor                     = Color.CRIMSON;
          _averageColor                       = Color.MAGENTA;
          _checkSectionsForValue              = false;
          _checkAreasForValue                 = false;
          _checkThreshold                     = false;
          _innerShadowEnabled                 = false;
          _thresholdVisible                   = false;
          _averageVisible                     = false;
          _sectionsVisible                    = false;
          _sectionsAlwaysVisible              = false;
          _sectionTextVisible                 = false;
          _sectionIconsVisible                = false;
          _highlightSections                  = false;
          _areasVisible                       = false;
          _areaTextVisible                    = false;
          _areaIconsVisible                   = false;
          _highlightAreas                     = false;
          _tickMarkSectionsVisible            = false;
          _tickLabelSectionsVisible           = false;
          _markersVisible                     = false;
          _tickLabelsVisible                  = true;
          _onlyFirstAndLastTickLabelVisible   = false;
          _majorTickMarksVisible              = true;
          _mediumTickMarksVisible             = true;
          _minorTickMarksVisible              = true;
          _tickMarkRingVisible                = false;
          _majorTickSpace                     = 10;
          _minorTickSpace                     = 1;
          _lcdVisible                         = false;
          _lcdCrystalEnabled                  = false;
          _ledVisible                         = false;
          _ledOn                              = false;
          _ledBlinking                        = false;
          _orientation                        = Orientation.HORIZONTAL;
          _gradientBarEnabled                 = false;
          _customTickLabelsEnabled            = false;
          customTickLabels                    = FXCollections.observableArrayList();
          _customTickLabelFontSize            = 18;
          _interactive                        = false;
          _buttonTooltipText                  = "";
          _keepAspect                         = true;
          _customFontEnabled                  = false;
          _customFont                         = Fonts.robotoRegular(12);
          _alert                              = false;
          _alertMessage                       = "";
          _smoothing                          = false;
          formatString                        = "%.2f";
  
          originalMinValue                    = -Double.MAX_VALUE;
          originalMaxValue                    = Double.MAX_VALUE;
          originalThreshold                   = Double.MAX_VALUE;
          lastCall                            = Instant.now();
          timeline                            = new Timeline();
          timeline.setOnFinished(e -> {
              if (isReturnToZero() && Double.compare(currentValue.get(), 0.0) != 0.0) {
                  final KeyValue KEY_VALUE2 = new KeyValue(value, 0, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                  final KeyFrame KEY_FRAME2 = new KeyFrame(Duration.millis((long) (0.8 * getAnimationDuration())), KEY_VALUE2);
                  timeline.getKeyFrames().setAll(KEY_FRAME2);
                  timeline.play();
              }
              fireUpdateEvent(FINISHED_EVENT);
          });
      }