synchronized Object getProperty(String returnType, String infoType, String paramInfo) {
    if (propertyTypes.length != PROP_COUNT * 3)
      Logger.warn("propertyTypes is not the right length: " + propertyTypes.length + " != " + PROP_COUNT * 3);
    
    Object info = getPropertyAsObject(infoType, paramInfo);
    if (returnType == null)
      return info;
    requestedReadable = returnType.equalsIgnoreCase("readable");
    if (requestedReadable)
      returnType = (isReadableAsString(infoType) ? "String" : "JSON");
    if (returnType.equalsIgnoreCase("String")) return info.toString();
    if (requestedReadable)
      return toReadable(infoType, info);
    else if (returnType.equalsIgnoreCase("JSON"))
      return "{" + toJSON(infoType, info) + "}";
    return info;
  }