docs: public Property getProperty( Object target,
                                   String propertyName,
                                   String label,
                                   String category,
                                   String description,
                                   Object... allowedValues )
          throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException,
          InvocationTargetException {
          CheckArg.isNotNull(target, "target");
          CheckArg.isNotEmpty(propertyName, "propertyName");
          Method[] setters = findMethods("set" + propertyName, false);
          boolean readOnly = setters.length < 1;
          Class<?> type = Object.class;
          Method[] getters = findMethods("get" + propertyName, false);
          if (getters.length == 0) {
              getters = findMethods("is" + propertyName, false);
          }
          if (getters.length == 0) {
              getters = findMethods("are" + propertyName, false);
          }
          if (getters.length > 0) {
              type = getters[0].getReturnType();
          }
          boolean inferred = true;
          Field field = null;
          try {
              // Find the corresponding field ...
              field = getField(targetClass, propertyName);
          } catch (NoSuchFieldException e) {
              // Nothing to do here
  
          }
          if (description == null) {
              Description desc = getAnnotation(Description.class, field, getters, setters);
              if (desc != null) {
                  description = localizedString(desc.i18n(), desc.value());
                  inferred = false;
              }
          }
          if (label == null) {
              Label labelAnnotation = getAnnotation(Label.class, field, getters, setters);
              if (labelAnnotation != null) {
                  label = localizedString(labelAnnotation.i18n(), labelAnnotation.value());
                  inferred = false;
              }
          }
          if (category == null) {
              Category cat = getAnnotation(Category.class, field, getters, setters);
              if (cat != null) {
                  category = localizedString(cat.i18n(), cat.value());
                  inferred = false;
              }
          }
          if (!readOnly) {
              ReadOnly readOnlyAnnotation = getAnnotation(ReadOnly.class, field, getters, setters);
              if (readOnlyAnnotation != null) {
                  readOnly = true;
                  inferred = false;
              }
          }
  
          Property property = new Property(propertyName, label, description, category, readOnly, type, allowedValues);
          property.setInferred(inferred);
          return property;
      }