@Override
  public boolean getBoolean(String sName) throws OmDeveloperException {
    boolean bValue = false;
    String placeholder = placeholders.get(sName);
    if (placeholder == null) {
      bValue = super.getBoolean(sName);
    } else {
      StandardQuestion sq = (StandardQuestion) getQuestion();
      if (sq.isPlaceholdersInitialized()) {
        String placeholderReplaced = sq.applyPlaceholders(placeholder);
        if (placeholderReplaced.equals("yes")) {
          bValue = true;
        } else if (placeholderReplaced.equals("no")) {
          bValue = false;
        } else {
          StringBuffer error = new StringBuffer();
          error.append('<');
          error.append(getTagName());
          error.append(">: property '");
          error.append(sName);
          error.append("' must be either 'yes' or 'no'");
          throw new OmFormatException(error.toString());
        }
      } else {
        StringBuffer error = new StringBuffer();
        error.append('<');
        error.append(getTagName());
        error.append(">: Placeholder ");
        error.append(placeholder);
        error.append(" for property '");
        error.append(sName);
        error.append("' can not be replaced because placeholders have not been initialized");
        throw new OmFormatException(error.toString());
      }

      // Do specific check if defined
      if (checks.containsKey(sName)) {
        checks.get(sName).check(new Boolean(bValue));
      }
    }
    return bValue;
  }
  @Override
  public double getDouble(String sName) throws OmDeveloperException {
    double dValue = 0.0;
    String placeholder = placeholders.get(sName);
    if (placeholder == null) {
      dValue = super.getDouble(sName);
    } else {
      StandardQuestion sq = (StandardQuestion) getQuestion();
      if (sq.isPlaceholdersInitialized()) {
        String placeholderReplaced = sq.applyPlaceholders(placeholder);
        try {
          dValue = Double.parseDouble(placeholderReplaced);
        } catch (NumberFormatException e) {
          StringBuffer error = new StringBuffer();
          error.append('<');
          error.append(getTagName());
          error.append(">: property '");
          error.append(sName);
          error.append("' is not a valid double");
          throw new OmFormatException(error.toString());
        }
      } else {
        StringBuffer error = new StringBuffer();
        error.append('<');
        error.append(getTagName());
        error.append(">: Placeholder ");
        error.append(placeholder);
        error.append(" for property '");
        error.append(sName);
        error.append("' can not be replaced because placeholders have not been initialized");
        throw new OmFormatException(error.toString());
      }

      // Do specific check if defined
      if (checks.containsKey(sName)) {
        checks.get(sName).check(new Double(dValue));
      }
    }
    return dValue;
  }
  @Override
  public String getString(String sName) throws OmDeveloperException {
    String sValue = null;
    String placeholder = placeholders.get(sName);
    if (placeholder == null) {
      sValue = super.getString(sName);
    } else {
      StandardQuestion sq = (StandardQuestion) getQuestion();
      if (sq.isPlaceholdersInitialized()) {
        sValue = sq.applyPlaceholders(placeholder);
      } else {
        sValue = placeholder;
      }

      // Check properties with restrictions
      if (PROPERTIES_TO_INITIALIZE_PLACEHOLDERS_WITH_RESTRICTIONS.containsKey(sName)) {
        String restriction = PROPERTIES_TO_INITIALIZE_PLACEHOLDERS_WITH_RESTRICTIONS.get(sName);
        if (!sValue.matches(restriction)) {
          StringBuffer error = new StringBuffer();
          error.append('<');
          error.append(getTagName());
          error.append(">: property '");
          error.append(sName);
          error.append("' has an invalid value ");
          error.append(sValue);
          throw new OmFormatException(error.toString());
        }
      }

      // Do specific check if defined
      if (checks.containsKey(sName)) {
        checks.get(sName).check(sValue);
      }
    }
    return sValue;
  }