More YAML work
diff --git a/src/main/java/org/testng/internal/Yaml.java b/src/main/java/org/testng/internal/Yaml.java
index 9db0a84..ae2b0b3 100644
--- a/src/main/java/org/testng/internal/Yaml.java
+++ b/src/main/java/org/testng/internal/Yaml.java
@@ -1,15 +1,23 @@
 package org.testng.internal;
 
+import org.testng.IObjectFactory;
 import org.testng.xml.XmlClass;
+import org.testng.xml.XmlPackage;
 import org.testng.xml.XmlSuite;
 import org.testng.xml.XmlTest;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
+/**
+ * YAML support for TestNG.
+ * 
+ * @author cbeust
+ */
 public class Yaml {
 
   private static void addToMap(Map suite, String name, Map target) {
@@ -41,47 +49,139 @@
     return parse(o);
   }
 
+  private static void setField(Object xml, Map<?, ?> map, String key, String methodName,
+      Class<?> parameter) {
+    Object o = map.get(key);
+    if (o != null) {
+      Method m;
+      try {
+        m = xml.getClass().getMethod(methodName, parameter);
+        m.invoke(xml, o);
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
   private static XmlSuite parse(Map o) {
       XmlSuite result = new XmlSuite();
   
+      //
+      // <suite>
+      //
       Map<Object, Object> suite = (Map<Object, Object>) o.get("suite");
-      result.setName((String) suite.get("name"));
-      result.setVerbose((Integer) suite.get("verbose"));
+      setField(result, suite, "name", "setName", String.class);
+      setField(result, suite, "verbose", "setVerbose", Integer.class);
       result.setParallel(((Boolean) suite.get("parallel")).toString());
       result.setThreadCount((Integer) suite.get("thread-count"));
       result.setDataProviderThreadCount((Integer) suite.get("data-provider-thread-count"));
+      result.setJUnit((Boolean) suite.get("junit"));
+      setField(result, suite, "configfailurepolicy", "setConfigFailurePolicy", String.class);
+      result.setThreadCount((Integer) suite.get("thread-count"));
+      result.setTimeOut((String) suite.get("time-out"));
+      setField(result, suite, "skipfailedinvocationcounts", "setSkipFailedInvocationCounts",
+          Boolean.class);
+      result.setObjectFactory((IObjectFactory) suite.get("object-factory"));
 
-      addToMap(suite, "parameters", result.getParameters());
+
+      //
+      // <method-selectors>
+      //
+      {
+        List<Map<String, Object>> selectors =
+            (List<Map<String, Object>>) suite.get("method-selectors");
+        if (selectors != null) {
+          for (Map<String, Object> s : selectors) {
+            String cls = (String) s.get("selector-class");
+            if (cls != null) {
+              org.testng.xml.XmlMethodSelector ms = new org.testng.xml.XmlMethodSelector();
+              ms.setPriority((Integer) s.get("priority"));
+              ms.setName(cls);
+              result.getMethodSelectors().add(ms);
+            }
+            String script = (String) s.get("script");
+            if (script != null) {
+              org.testng.xml.XmlMethodSelector ms = new org.testng.xml.XmlMethodSelector();
+              ms.setExpression(script);
+              ms.setLanguage((String) s.get("language"));
+              result.getMethodSelectors().add(ms);
+            }
+          }
+        }
+      }
+
+      //
+      // <listeners>
+      //
       addToList(suite, "listeners", result.getListeners());
 
+      //
+      // <packages>
+      //
       {
-        Map<String, Object> tests = (Map<String, Object>) suite.get("tests");
-        if (tests != null) {
+        List<Map<String, String>> packages = (List<Map<String, String>>) suite.get("packages");
+        for (Map<String, String> p : packages) {
+          XmlPackage xp = new XmlPackage();
+          xp.setName(p.get("name"));
+          result.getXmlPackages().add(xp);
+        }
+      }
+
+      //
+      // <parameters>
+      //
+
+      addToMap(suite, "parameters", result.getParameters());
+
+
+      //
+      // <test>
+      //
+      {
+        List<Map<String, Object>> tests = (List<Map<String, Object>>) suite.get("tests");
+        for (Map<String, Object> test : tests) {
           XmlTest xmlTest = new XmlTest(result);
-          xmlTest.setName(tests.get("name").toString());
-          List<Map<String, String>> classes = (List<Map<String, String>>) tests.get("classes");
+          xmlTest.setName(test.get("name").toString());
+          setField(xmlTest, test, "junit", "setJUnit", Boolean.class);
+          setField(xmlTest, test, "verbose", "setVerbose", Integer.class);
+          xmlTest.setParallel((String) test.get("parallel"));
+          setField(xmlTest, test, "thread-count", "setThreadCount", Integer.class);
+          setField(xmlTest, test, "time-out", "setTimeOut", Long.class);
+          setField(xmlTest, test, "skipfailedinvocationcounts", "setSkipFailedInvocationCounts",
+              Boolean.class);
+          setField(xmlTest, test, "preserve-order", "setPreserveOrder", Boolean.class);
+
+          //
+          // <classes>
+          //
+          List<Map<String, String>> classes = (List<Map<String, String>>) test.get("classes");
           for (Map<String, String> c : classes) {
             XmlClass xmlClass = new XmlClass(c.get("name"));
             xmlTest.getXmlClasses().add(xmlClass);
           }
+
+          //
+          // <parameter>
+          //
+
+          //
+          // <groups>
+          //
+
+          //
+          // <packages>
+          //
         }
       }
-//      List<Map<String, String>> listeners = (List<Map<String, String>>) suite.get("listeners");
-//      if (listeners != null) {
-//        for (Map<String, String> listener : listeners) {
-//          for (Map.Entry p : listener.entrySet()) {
-//            result.getListeners().add(p.getValue().toString());
-//          }
-//        }
-//      }
-  
-      //    Map<Object, String> listeners = (Map<Object, String>) suite.get("listeners");
-  //    if (parameters != null) {
-  //      for (Map.Entry entry : listeners.entrySet()) {
-  //        System.out.println("Listener Entry:" + entry.getKey() + ":" + entry.getValue());
-  //      }
-  //    }
-  
+
+      //
+      // <method-selectors>
+      //
+
+      //
+      // <suite-files>
+      //
+
       System.out.println(result.toXml());
       return result;
     }
diff --git a/src/test/resources/testng-single.yaml b/src/test/resources/testng-single.yaml
index e701ffa..c93a682 100644
--- a/src/test/resources/testng-single.yaml
+++ b/src/test/resources/testng-single.yaml
@@ -5,16 +5,29 @@
   thread-count: 4
   data-provider-thread-count: 3
 
+  listeners:
+    - name: test.invokedmethodlistener.MyListener
+
+  method-selectors:
+    - selector-class: org.testng.internal.XmlMethodSelector
+      priority: 1
+    - script: groups.containsKey("test1")
+      language: beanshell
+
+  packages:
+    - name: test.testng355.org.apache.tapestry5
+    - name: test.testng355.org.apache.tapestry5.dom
+
   parameters:
     - name: n
       value: 42
     - name: p
       value: 10
 
-  listeners:
-    - name: test.invokedmethodlistener.MyListener
-
   tests:
-    name: Test1
-    classes:
-      - name: test.tmp.A
\ No newline at end of file
+    - name: Test1
+      classes:
+        - name: test.tmp.A
+    - name: Test2
+      classes:
+        - name: test.tmp.B
\ No newline at end of file