class FunctionFinder {

    public List<FunctionName> getAllFunctionDescriptions(){
        Set<FunctionFactory> functionFactories = CommonFactoryFinder.getFunctionFactories(null);
        List<FunctionName> allFunctionDescriptions = new ArrayList<FunctionName>();
        
        for (FunctionFactory factory : functionFactories) {
            List<FunctionName> functionNames = factory.getFunctionNames();
            allFunctionDescriptions.addAll( functionNames );
        }
        Collections.sort( allFunctionDescriptions, new Comparator<FunctionName>() {
            public int compare(FunctionName o1, FunctionName o2) {
                if( o1 == null && o2 == null ) return 0;
                if( o1 == null && o2 != null ) return 1;
                if( o1 != null && o2 == null ) return -1;
                
                return o1.getName().compareTo( o2.getName() );
            }
        } );
        return Collections.unmodifiableList(allFunctionDescriptions);
    }

    public  FunctionFinder();

}