code: @Override
      public boolean isMoveDoable(ScoreDirector<Solution_> scoreDirector) {
          if (Objects.equals(leftValue, rightValue)
                  || Objects.equals(leftEntity, rightValue) || Objects.equals(rightEntity, leftValue)) {
              return false;
          }
          if (rightEntity == null) {
              // TODO Currently unsupported because we fail to create a valid undoMove... even though doMove supports it
              if (leftAnchor == rightAnchor) {
                  return false;
              }
          }
          if (!variableDescriptor.isValueRangeEntityIndependent()) {
              ValueRangeDescriptor<Solution_> valueRangeDescriptor = variableDescriptor.getValueRangeDescriptor();
              Solution_ workingSolution = scoreDirector.getWorkingSolution();
              if (rightEntity != null) {
                  ValueRange rightValueRange = valueRangeDescriptor.extractValueRange(workingSolution, rightEntity);
                  if (!rightValueRange.contains(leftValue)) {
                      return false;
                  }
              }
              ValueRange leftValueRange = valueRangeDescriptor.extractValueRange(workingSolution, leftEntity);
              if (!leftValueRange.contains(rightValue)) {
                  return false;
              }
          }
          return true;
      }
docs: ************************************************************************