@SuppressWarnings("unchecked")
/**
 * Returns the results of calling the specified method from the specified 
 * class using the specified parameters.
 * @param c Class to call the method on.
 * @param method Name of the method.
 * @param paramTypes Data types of the parameters being passed to the method.
 * @param params Actual parameters to pass to the method.
 * @return Specified method's return value, or null if error or void.
*/
    private static Object runMethod( Class c, String method, Class[] paramTypes,
                                     Object[] params )
    {
        Method m = null;
        try
        {
            m = c.getMethod( method, paramTypes );  // <--- generates a warning
        }
        catch( NoSuchMethodException nsme )
        {
            errorMessage( "NoSuchMethodException thrown when attempting " +
                          "to call method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }
        catch( SecurityException se )
        {
            errorMessage( "Access denied when attempting to call method '" +
                          method + "' in method 'runMethod'" );
            return null;
        }
        catch( NullPointerException npe )
        {
            errorMessage( "NullPointerException thrown when attempting " +
                          "to call method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }
        if( m == null )
        {
            errorMessage( "Method '" + method + "' not found for the class " +
                          "specified in method 'runMethod'" );
            return null;
        }

        Object o = null;
        try
        {
            o = m.invoke( null, params );
        }
        catch( IllegalAccessException iae )
        {
            errorMessage( "IllegalAccessException thrown when attempting " +
                          "to invoke method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }
        catch( IllegalArgumentException iae )
        {
            errorMessage( "IllegalArgumentException thrown when attempting " +
                          "to invoke method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }
        catch( InvocationTargetException ite )
        {
            errorMessage( "InvocationTargetException thrown while attempting " +
                          "to invoke method 'Library.getTitle' in " +
                          "method 'getLibraryTitle'" );
            return null;
        }
        catch( NullPointerException npe )
        {
            errorMessage( "NullPointerException thrown when attempting " +
                          "to invoke method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }
        catch( ExceptionInInitializerError eiie )
        {
            errorMessage( "ExceptionInInitializerError thrown when " +
                          "attempting to invoke method '" + method + "' in " +
                          "method 'runMethod'" );
            return null;
        }

        return( o );
    }