public static Collection generate(PeerGenSettings peerGenSettings)
            throws ClassNotFoundException, java.io.IOException, ProjectFormatException {
        ArrayList classList = new ArrayList();
        Iterator inputClassIterator = peerGenSettings.getClassNames();

        while (inputClassIterator.hasNext() == true) {
            ClassNode classNode = ClassNode.getClassNode((String) inputClassIterator.next());
            if (classNode.isInterface() == false) {
                throw new ProjectFormatException(classNode.getFullyQualifiedClassName() + " is not an interface.");
            }

            classList.add(new DependencyData(classNode.getPackageName().replace('.', File.separatorChar),
                    classNode.getCPPClassName() + "Peer.h",
                    classNode.getCPPClassName() + "Peer.cpp"));
            classList.add(new DependencyData(classNode.getPackageName().replace('.', File.separatorChar),
                    classNode.getCPPClassName() + "Mapping.h",
                    classNode.getCPPClassName() + "Mapping.cpp"));

            System.out.println("generating C++ Peer Class for " + classNode.getFullyQualifiedClassName() + " ...");
            peerHeaderGenerator.generate(classNode, peerGenSettings);
            peerImplGenerator.generate(classNode, peerGenSettings);
            mappingCodeHeaderGenerator.generate(classNode, peerGenSettings);
            mappingCodeImplGenerator.generate(classNode, peerGenSettings);
            javaProxyGenerator.generate(classNode, peerGenSettings);
            peerFactoryHeaderGenerator.generate(classNode, peerGenSettings);

            if (peerGenSettings.getUseRichTypes() == true) {
                ProxyGenSettings proxyGenSettings = peerGenSettings.getProxyGenSettings();
                Iterator deps = classNode.getDependencies();
                while (deps.hasNext() == true) {
                    ClassNode next = (ClassNode) deps.next();
                    if (next.isArray() == true) {
                        proxyGenSettings.addClassName(next.getJNIString().replace('/', '.'));
                    } else {
                        proxyGenSettings.addClassName(next.getFullyQualifiedClassName());
                    }
                }
            }
        }

        if (peerGenSettings.getUseRichTypes() == true) {
            classList.addAll(ProxyGenerator.generate(peerGenSettings.getProxyGenSettings()));
        }

        return classList;
    }