docs: public Method getMethodInfo(String methodName) throws FlickrException {
          Map<String, Object> parameters = new HashMap<String, Object>();
          parameters.put("method", METHOD_GET_METHOD_INFO);
  
          parameters.put("method_name", methodName);
  
          Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret);
          if (response.isError()) {
              throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
          }
  
          Element methodElement = response.getPayload();
          Method method = new Method();
          method.setName(methodElement.getAttribute("name"));
          method.setNeedsLogin("1".equals(methodElement.getAttribute("needslogin")));
          method.setNeedsSigning("1".equals(methodElement.getAttribute("needssigning")));
          String requiredPermsStr = methodElement.getAttribute("requiredperms");
          if (requiredPermsStr != null && requiredPermsStr.length() > 0) {
              try {
                  int perms = Integer.parseInt(requiredPermsStr);
                  method.setRequiredPerms(perms);
              } catch (NumberFormatException e) {
                  // what shall we do?
                  e.printStackTrace();
              }
          }
          method.setDescription(XMLUtilities.getChildValue(methodElement, "description"));
          method.setResponse(XMLUtilities.getChildValue(methodElement, "response"));
          method.setExplanation(XMLUtilities.getChildValue(methodElement, "explanation"));
  
          List<Argument> arguments = new ArrayList<Argument>();
          Element argumentsElement = XMLUtilities.getChild(methodElement, "arguments");
          // tolerant fix for incorrect nesting of the <arguments> element
          // as observed in current flickr responses of this method
          //
          // specified as
          // <rsp>
          // <method>
          // <arguments>
          // <errors>
          // <method>
          // </rsp>
          //
          // observed as
          // <rsp>
          // <method>
          // <arguments>
          // <errors>
          // </rsp>
          //
          if (argumentsElement == null) {
              _log.debug("getMethodInfo: Using workaround for arguments array");
              Element parent = (Element) methodElement.getParentNode();
              Element child = XMLUtilities.getChild(parent, "arguments");
              if (child != null) {
                  argumentsElement = child;
              }
          }
          NodeList argumentElements = argumentsElement.getElementsByTagName("argument");
          for (int i = 0; i < argumentElements.getLength(); i++) {
              Argument argument = new Argument();
              Element argumentElement = (Element) argumentElements.item(i);
              argument.setName(argumentElement.getAttribute("name"));
              argument.setOptional("1".equals(argumentElement.getAttribute("optional")));
              argument.setDescription(XMLUtilities.getValue(argumentElement));
              arguments.add(argument);
          }
          method.setArguments(arguments);
  
          Element errorsElement = XMLUtilities.getChild(methodElement, "errors");
          // tolerant fix for incorrect nesting of the <errors> element
          // as observed in current flickr responses of this method
          // as of 2006-09-15
          //
          // specified as
          // <rsp>
          // <method>
          // <arguments>
          // <errors>
          // <method>
          // </rsp>
          //
          // observed as
          // <rsp>
          // <method>
          // <arguments>
          // <errors>
          // </rsp>
          //
          if (errorsElement == null) {
              _log.debug("getMethodInfo: Using workaround for errors array");
              Element parent = (Element) methodElement.getParentNode();
              Element child = XMLUtilities.getChild(parent, "errors");
              if (child != null) {
                  errorsElement = child;
              }
          }
          List<Error> errors = new ArrayList<Error>();
          NodeList errorElements = errorsElement.getElementsByTagName("error");
          for (int i = 0; i < errorElements.getLength(); i++) {
              Error error = new Error();
              Element errorElement = (Element) errorElements.item(i);
              error.setCode(errorElement.getAttribute("code"));
              error.setMessage(errorElement.getAttribute("message"));
              error.setExplaination(XMLUtilities.getValue(errorElement));
              errors.add(error);
          }
          method.setErrors(errors);
  
          return method;
      }