process = Runtime.runtime.exec("nm /System/Library/PrivateFrameworks/XQuery.framework/XQuery"); is = process.getInputStream(); methodRE = ~".*(.)\\[(.+) (.+)\\]"; classes = [:]; is.eachLine { m = methodRE.matcher(it); if (m.matches()) { classname = m.group(2); method = m.group(3); classmap = classes[classname]; if (classmap == null) { classmap = [:]; classes[classname] = classmap; } switch (m.group(1)) { case "+": classmethods = classmap.classmethods; if (classmethods == null) { classmethods = []; classmap.classmethods = classmethods; } classmethods.add(method); break; case "-": instancemethods = classmap.instancemethods; if (instancemethods == null) { instancemethods = []; classmap.instancemethods = instancemethods; } instancemethods.add(method); break; } } } classes.keySet().each { println "Processing: ${it}"; file = new java.io.FileWriter("${it}.h"); file << "@interface ${it} : NSObject {\n}\n"; formatter = { modifier, it | file << "${modifier}(id)"; if (it.indexOf(":") == -1) { file << "${it};\n"; } else { methodsplit = Arrays.asList(it.split(":")); i = 0; methodsplit.each { i++; file << "${it}:(id)arg${i} "; } file << ";\n"; } } classes[it]->classmethods->each { formatter ("+", it) } classes[it]->instancemethods->each { formatter ("-", it) } file << "@end\n"; file.close(); }