docs: public static Object getPropertyValue(Object pObject, String pProperty) {
          //
          // TODO: Support get(Object) method of Collections!
          //       Handle lists and arrays with [] (index) operator
          //
  
          if (pObject == null || pProperty == null || pProperty.length() < 1) {
              return null;
          }
  
          Class<?> objClass = pObject.getClass();
  
          Object result = pObject;
  
          // Method for method...
          String subProp;
          int begIdx = 0;
          int endIdx = begIdx;
  
          while (begIdx < pProperty.length() && begIdx >= 0) {
  
              endIdx = pProperty.indexOf(".", endIdx + 1);
              if (endIdx > 0) {
                  subProp = pProperty.substring(begIdx, endIdx);
                  begIdx = endIdx + 1;
              }
              else {
                  // The final property!
                  // If there's just the first-level property, subProp will be
                  // equal to property
                  subProp = pProperty.substring(begIdx);
                  begIdx = -1;
              }
  
              // Check for "[" and "]"
              Object[] param = null;
              Class[] paramClass = new Class[0];
  
              int begBracket;
              if ((begBracket = subProp.indexOf("[")) > 0) {
                  // An error if there is no matching bracket
                  if (!subProp.endsWith("]")) {
                      return null;
                  }
  
                  String between = subProp.substring(begBracket + 1,
                                                     subProp.length() - 1);
                  subProp = subProp.substring(0, begBracket);
  
                  // If brackets exist, check type of argument between brackets
                  param = new Object[1];
                  paramClass = new Class[1];
  
                  //try {
                  // TODO: isNumber returns true, even if too big for integer...
                  if (StringUtil.isNumber(between)) {
                      // We have a number
                      // Integer -> array subscript -> getXXX(int i)
                      try {
                          // Insert param and it's Class
                          param[0] = Integer.valueOf(between);
                          paramClass[0] = Integer.TYPE; // int.class
                      }
                      catch (NumberFormatException e) {
                          // ??
                          // Probably too small or too large value..
                      }
                  }
                  else {
                      //catch (NumberFormatException e) {
                      // Not a number... Try String
                      // String -> Hashtable key -> getXXX(String str)
                      // Insert param and it's Class
                      param[0] = between.toLowerCase();
                      paramClass[0] = String.class;
                  }
              }
  
              Method method;
              String methodName = "get" + StringUtil.capitalize(subProp);
              try {
                  // Try to get the "get" method for the given property
                  method = objClass.getMethod(methodName, paramClass);
              }
              catch (NoSuchMethodException e) {
                  System.err.print("No method named \"" + methodName + "()\"");
                  // The array might be of size 0...
                  if (paramClass.length > 0 && paramClass[0] != null) {
                      System.err.print(" with the parameter " + paramClass[0].getName());
                  }
  
                  System.err.println(" in class " + objClass.getName() + "!");
                  return null;
              }
  
              // If method for some reason should be null, give up
              if (method == null) {
                  return null;
              }
  
              try {
                  // We have a method, try to invoke it
                  // The resutling object will be either the property we are
                  // Looking for, or the parent
  
                  //		System.err.println("Trying " + objClass.getName() + "." + method.getName() + "(" + ((param != null && param.length > 0) ? param[0] : "") + ")");
                  result = method.invoke(result, param);
              }
              catch (InvocationTargetException e) {
                  System.err.println("property=" + pProperty + " & result=" + result + " & param=" + Arrays.toString(param));
                  e.getTargetException().printStackTrace();
                  e.printStackTrace();
                  return null;
              }
              catch (IllegalAccessException e) {
                  e.printStackTrace();
                  return null;
              }
              catch (NullPointerException e) {
                  System.err.println(objClass.getName() + "." + method.getName() + "(" + ((paramClass.length > 0 && paramClass[0] != null) ? paramClass[0].getName() : "") + ")");
                  e.printStackTrace();
                  return null;
              }
  
              if (result != null) {
                  // Get the class of the reulting object
                  objClass = result.getClass();
              }
              else {
                  return null;
              }
          } // while
  
          return result;
      }