Refactor: use Version enum instead of Array of Integers
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e97e179..232f480 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,10 @@
     </properties>
     <body>
         <release version="1.11" date="in Mercurial" description="Maintenance">
+             <action dev="py4fun" type="update">
+                Refactor: use Version enum instead of Array of Integers. 
+                This is done to simplify fixing issue 149 (2012-06-09)
+             </action>
              <action dev="py4fun" type="fix">
                 Add tests for issue 148  (2012-06-07)
              </action>
diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index c829054..bfdaff5 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -147,9 +147,13 @@
             return version;
         }
 
+        public String getRepresentation() {
+            return version[0] + "." + version[1];
+        }
+
         @Override
         public String toString() {
-            return "Version: " + version[0] + "." + version[1];
+            return "Version: " + getRepresentation();
         }
     }
 
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
index 9e2b397..a3b6452 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
@@ -29,6 +29,7 @@
 
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.ScalarStyle;
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.CollectionEndEvent;
@@ -818,13 +819,11 @@
 
     // Analyzers.
 
-    private String prepareVersion(Integer[] version) {
-        Integer major = version[0];
-        Integer minor = version[1];
-        if (major != 1) {
-            throw new EmitterException("unsupported YAML version: " + version[0] + "." + version[1]);
+    private String prepareVersion(Version version) {
+        if (version.getArray()[0] != 1) {
+            throw new EmitterException("unsupported YAML version: " + version);
         }
-        return major.toString() + "." + minor.toString();
+        return version.getRepresentation();
     }
 
     private final static Pattern HANDLE_FORMAT = Pattern.compile("^![-_\\w]*!$");
diff --git a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
index db4a27b..18eeea9 100644
--- a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
+++ b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
@@ -17,6 +17,7 @@
 
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.Mark;
 
 /**
@@ -27,14 +28,18 @@
  */
 public final class DocumentStartEvent extends Event {
     private final boolean explicit;
-    private final Integer[] version;
+    private final Version version;
     private final Map<String, String> tags;
 
-    public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Integer[] version,
+    public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Version version,
             Map<String, String> tags) {
         super(startMark, endMark);
         this.explicit = explicit;
         this.version = version;
+        // TODO enforce not null
+        // if (tags == null) {
+        // throw new NullPointerException("Tags must be provided.");
+        // }
         this.tags = tags;
     }
 
@@ -50,7 +55,7 @@
      *         components, the major and minor part of the version (in this
      *         order).
      */
-    public Integer[] getVersion() {
+    public Version getVersion() {
         return version;
     }
 
diff --git a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
index db40329..ca90680 100644
--- a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
+++ b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
@@ -20,6 +20,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.Mark;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
@@ -122,7 +123,7 @@
 
     private final Scanner scanner;
     private Event currentEvent;
-    private List<Integer> yamlVersion;
+    private Version yamlVersion;
     private Map<String, String> tagHandles;
     private final ArrayStack<Production> states;
     private final ArrayStack<Mark> marks;
@@ -223,23 +224,15 @@
             if (!scanner.checkToken(Token.ID.StreamEnd)) {
                 Token token = scanner.peekToken();
                 Mark startMark = token.getStartMark();
-                List<Object> version_tags = processDirectives();
-                List<Object> version = (List<Object>) version_tags.get(0);
-                Map<String, String> tags = (Map<String, String>) version_tags.get(1);
+                VersionTagsTuple tuple = processDirectives();
                 if (!scanner.checkToken(Token.ID.DocumentStart)) {
                     throw new ParserException(null, null, "expected '<document start>', but found "
                             + scanner.peekToken().getTokenId(), scanner.peekToken().getStartMark());
                 }
                 token = scanner.getToken();
                 Mark endMark = token.getEndMark();
-                Integer[] versionInteger;
-                if (version != null) {
-                    versionInteger = new Integer[2];
-                    versionInteger = version.toArray(versionInteger);
-                } else {
-                    versionInteger = null;
-                }
-                event = new DocumentStartEvent(startMark, endMark, true, versionInteger, tags);
+                event = new DocumentStartEvent(startMark, endMark, true, tuple.getVersion(),
+                        tuple.getTags());
                 states.push(new ParseDocumentEnd());
                 state = new ParseDocumentContent();
             } else {
@@ -293,7 +286,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    private List<Object> processDirectives() {
+    private VersionTagsTuple processDirectives() {
         yamlVersion = null;
         tagHandles = new HashMap<String, String>();
         while (scanner.checkToken(Token.ID.Directive)) {
@@ -311,7 +304,16 @@
                             "found incompatible YAML document (version 1.* is required)",
                             token.getStartMark());
                 }
-                yamlVersion = (List<Integer>) token.getValue();
+                Integer minor = value.get(1);
+                switch (minor) {
+                case 0:
+                    yamlVersion = Version.V1_0;
+                    break;
+
+                default:
+                    yamlVersion = Version.V1_1;
+                    break;
+                }
             } else if (token.getName().equals("TAG")) {
                 List<String> value = (List<String>) token.getValue();
                 String handle = value.get(0);
@@ -335,7 +337,7 @@
                 tagHandles.put(key, DEFAULT_TAGS.get(key));
             }
         }
-        return value;
+        return new VersionTagsTuple(yamlVersion, tagHandles);
     }
 
     /**
diff --git a/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
new file mode 100644
index 0000000..eda979c
--- /dev/null
+++ b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2008-2012, http://www.snakeyaml.org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.yaml.snakeyaml.parser;
+
+import java.util.Map;
+
+import org.yaml.snakeyaml.DumperOptions.Version;
+
+public class VersionTagsTuple {
+    private Version version;
+    private Map<String, String> tags;
+
+    public VersionTagsTuple(Version version, Map<String, String> tags) {
+        this.version = version;
+        this.tags = tags;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    public Map<String, String> getTags() {
+        return tags;
+    }
+}
diff --git a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
index 427df74..f5faf21 100644
--- a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
+++ b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
@@ -24,6 +24,7 @@
 import java.util.Set;
 
 import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.emitter.Emitable;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
@@ -52,7 +53,7 @@
     private final Resolver resolver;
     private boolean explicitStart;
     private boolean explicitEnd;
-    private Integer[] useVersion;
+    private Version useVersion;
     private Map<String, String> useTags;
     private Set<Node> serializedNodes;
     private Map<Node, String> anchors;
@@ -66,7 +67,7 @@
         this.explicitStart = opts.isExplicitStart();
         this.explicitEnd = opts.isExplicitEnd();
         if (opts.getVersion() != null) {
-            this.useVersion = opts.getVersion().getArray();
+            this.useVersion = opts.getVersion();
         }
         this.useTags = opts.getTags();
         this.serializedNodes = new HashSet<Node>();
diff --git a/src/test/java/org/pyyaml/CanonicalParser.java b/src/test/java/org/pyyaml/CanonicalParser.java
index d434319..df3a10c 100644
--- a/src/test/java/org/pyyaml/CanonicalParser.java
+++ b/src/test/java/org/pyyaml/CanonicalParser.java
@@ -17,6 +17,7 @@
 
 import java.util.ArrayList;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
 import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -68,7 +69,7 @@
             scanner.getToken(Token.ID.Directive);
         }
         scanner.getToken(Token.ID.DocumentStart);
-        events.add(new DocumentStartEvent(null, null, true, new Integer[] { 1, 1 }, null));
+        events.add(new DocumentStartEvent(null, null, true, Version.V1_1, null));
         parseNode();
         events.add(new DocumentEndEvent(null, null, true));
     }
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
index 4e7adec..4b17be6 100644
--- a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
@@ -19,8 +19,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.constructor.AbstractConstruct;
 import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
 import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -94,11 +96,19 @@
             } else if (className.equals("DocumentStartEvent")) {
                 Map<String, String> tags = (Map<String, String>) mapping.get("tags");
                 List<Integer> versionList = (List<Integer>) mapping.get("version");
-                Integer[] version = null;
+                Version version = null;
+                // TODO ???
                 if (versionList != null) {
-                    version = new Integer[2];
-                    version[0] = versionList.get(0).intValue();
-                    version[1] = versionList.get(1).intValue();
+                    Integer major = versionList.get(0).intValue();
+                    if (major != 1) {
+                        throw new YAMLException("Unsupported version.");
+                    }
+                    Integer minor = versionList.get(1).intValue();
+                    if (minor == 0) {
+                        version = Version.V1_0;
+                    } else {
+                        version = Version.V1_1;
+                    }
                 }
                 value = new DocumentStartEvent(null, null, false, version, tags);
             } else if (className.equals("MappingEndEvent")) {
diff --git a/src/test/resources/pyyaml/unsupported-version.emitter-error b/src/test/resources/pyyaml/unsupported-version.emitter-error
deleted file mode 100644
index f9c6197..0000000
--- a/src/test/resources/pyyaml/unsupported-version.emitter-error
+++ /dev/null
@@ -1,5 +0,0 @@
-- !StreamStart
-- !DocumentStart { version: [5,6] }
-- !Scalar { value: foo }
-- !DocumentEnd
-- !StreamEnd