code: protected boolean isActive(FeatureState featureState, FeatureUser user, String propertyName, String propertyValue) {
          String expectedValue = featureState.getParameter(PARAM_PROPERTY_VALUE);
          if(expectedValue == null) {
              expectedValue = DEFAULT_STATE_VALUE;
          }
          return Strings.isNotBlank(propertyValue) && expectedValue.equalsIgnoreCase(propertyValue);
      }
docs: <p>
  This method is called by {@link #isActive(FeatureState, FeatureUser)} with the property name and value to make
  the decision as to whether the feature is active.
  </p>
  <p>
  By default, this method will convert {@code propertyValue} into a boolean using
  {@link Strings#toBoolean(String)} but implementations are free to override this, where needed. However, it would
  be ideal if all implementations tried to support the same value formats to allow for a unified experience. The
  default implementation throw an {@code IllegalArgumentException} if {@code propertyValue} does not match any of
  the predefined boolean representations.
  </p>
  <p>
  This method should never return {@literal true} if {@code propertyValue} is {@literal null}.
  </p>
  
  @param featureState
  the {@link FeatureState} which represents the current configuration of the feature
  @param user
  the {@link FeatureUser user} for which to decide whether the feature is active (may be {@literal null})
  @param propertyName
  the name of the property on which to base the activation of the feature
  @param propertyValue
  the (raw) value of the property on which to base the activation of the feature (may be {@literal null} if
  none was found)
  @return {@literal true} if the feature should be active; otherwise {@literal false}.
  @throws IllegalArgumentException
  If {@code propertyValue} is non-{@literal null} <b>and</b> does not match any of the predefined boolean
  representations.