docs: private static void introspectListenerMethods(String type, Method theMethod, HashMap<String, HashMap> methodsTable)
  	{
  		String methodName = theMethod.getName();
  		if (methodName == null)
  		{
  			return;
  		}
  
  		if (!((methodName.startsWith(type)) && (methodName.endsWith(SUFFIX_LISTEN))))
  		{
  			return;
  		}
  
  		String listenerName = methodName.substring(type.length());
  		String eventName = listenerName.substring(0, listenerName.lastIndexOf(SUFFIX_LISTEN));
  		if ((eventName == null) || (eventName.length() == 0))
  		{
  			return;
  		}
  
  		Class[] paramTypes = theMethod.getParameterTypes();
  		if ((paramTypes == null) || (paramTypes.length != 1))
  		{
  			return;
  		}
  
  		Class<?> listenerType = paramTypes[0];
  
  		if (!EventListener.class.isAssignableFrom(listenerType))
  		{
  			return;
  		}
  
  		if (!listenerType.getName().endsWith(listenerName))
  		{
  			return;
  		}
  
  		HashMap table = methodsTable.get(eventName);
  		if (table == null)
  		{
  			table = new HashMap();
  		}
  		// put listener type
  		if (table.get("listenerType") == null) { //$NON-NLS-1$
  			table.put("listenerType", listenerType); //$NON-NLS-1$
  			table.put("listenerMethods", //$NON-NLS-1$
  					introspectListenerMethods(listenerType));
  		}
  		// put add / remove
  		table.put(type, theMethod);
  
  		// determine isUnicast()
  		if (type.equals(PREFIX_ADD))
  		{
  			Class[] exceptionTypes = theMethod.getExceptionTypes();
  			if (exceptionTypes != null)
  			{
  				for (int i = 0; i < exceptionTypes.length; i++)
  				{
  					if (exceptionTypes[i].getName().equals(TooManyListenersException.class.getName()))
  					{
  						table.put("isUnicast", "true"); //$NON-NLS-1$//$NON-NLS-2$
  						break;
  					}
  				}
  			}
  		}
  
  		methodsTable.put(eventName, table);
  	}