use Tag in Representer
diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index 2a7acfd..b58d284 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -20,6 +20,7 @@
 import org.yaml.snakeyaml.emitter.Emitter;
 import org.yaml.snakeyaml.emitter.ScalarAnalysis;
 import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.nodes.Tag;
 
 /**
  * @see <a href="http://pyyaml.org/wiki/PyYAML">PyYAML</a> for more information
@@ -161,7 +162,7 @@
     private LineBreak lineBreak = LineBreak.UNIX;
     private boolean explicitStart = false;
     private boolean explicitEnd = false;
-    private String explicitRoot = null;
+    private Tag explicitRoot = null;
     private Version version = null;
     private Map<String, String> tags = null;
 
@@ -267,16 +268,26 @@
         return defaultFlowStyle;
     }
 
-    public String getExplicitRoot() {
+    public Tag getExplicitRoot() {
         return explicitRoot;
     }
 
     /**
      * @param expRoot
      *            tag to be used for the root node. (JavaBeans may use
-     *            Tags.MAP="tag:yaml.org,2002:map")
+     *            Tag.MAP="tag:yaml.org,2002:map")
+     * @deprecated use Tag instead of String
      */
     public void setExplicitRoot(String expRoot) {
+        setExplicitRoot(Tag.createTag(expRoot));
+    }
+
+    /**
+     * @param expRoot
+     *            tag to be used for the root node. (JavaBeans may use
+     *            Tag.MAP="tag:yaml.org,2002:map")
+     */
+    public void setExplicitRoot(Tag expRoot) {
         if (expRoot == null) {
             throw new NullPointerException("Root tag must be specified.");
         }
@@ -315,6 +326,7 @@
         return tags;
     }
 
+    // TODO should use Tag ???
     public void setTags(Map<String, String> tags) {
         this.tags = tags;
     }
diff --git a/src/main/java/org/yaml/snakeyaml/Yaml.java b/src/main/java/org/yaml/snakeyaml/Yaml.java
index c3b842b..49ce288 100644
--- a/src/main/java/org/yaml/snakeyaml/Yaml.java
+++ b/src/main/java/org/yaml/snakeyaml/Yaml.java
@@ -26,6 +26,7 @@
 

 import org.yaml.snakeyaml.events.Event;

 import org.yaml.snakeyaml.nodes.Node;

+import org.yaml.snakeyaml.nodes.Tag;

 import org.yaml.snakeyaml.reader.UnicodeReader;

 import org.yaml.snakeyaml.resolver.Resolver;

 

@@ -243,6 +244,24 @@
      * Add an implicit scalar detector. If an implicit scalar value matches the

      * given regexp, the corresponding tag is assigned to the scalar.

      * 

+     * @deprecated use Tag instead of String

+     * @param tag

+     *            tag to assign to the node

+     * @param regexp

+     *            regular expression to match against

+     * @param first

+     *            a sequence of possible initial characters or null (which means

+     *            any).

+     * 

+     */

+    public void addImplicitResolver(String tag, Pattern regexp, String first) {

+        addImplicitResolver(Tag.createTag(tag), regexp, first);

+    }

+

+    /**

+     * Add an implicit scalar detector. If an implicit scalar value matches the

+     * given regexp, the corresponding tag is assigned to the scalar.

+     * 

      * @param tag

      *            tag to assign to the node

      * @param regexp

@@ -251,7 +270,7 @@
      *            a sequence of possible initial characters or null (which means

      *            any).

      */

-    public void addImplicitResolver(String tag, Pattern regexp, String first) {

+    public void addImplicitResolver(Tag tag, Pattern regexp, String first) {

         resolver.addImplicitResolver(tag, regexp, first);

     }

 

diff --git a/src/main/java/org/yaml/snakeyaml/composer/Composer.java b/src/main/java/org/yaml/snakeyaml/composer/Composer.java
index d7bc469..379235d 100644
--- a/src/main/java/org/yaml/snakeyaml/composer/Composer.java
+++ b/src/main/java/org/yaml/snakeyaml/composer/Composer.java
@@ -171,12 +171,13 @@
         ScalarEvent ev = (ScalarEvent) parser.getEvent();
         String tag = ev.getTag();
         boolean resolved = false;
+        Tag nodeTag = Tag.createTag(tag);
         if (tag == null || tag.equals("!")) {
-            tag = resolver.resolve(NodeId.scalar, ev.getValue(), ev.getImplicit().isFirst());
+            nodeTag = resolver.resolve(NodeId.scalar, ev.getValue(), ev.getImplicit().isFirst());
             resolved = true;
         }
-        Node node = new ScalarNode(Tag.createTag(tag), resolved, ev.getValue(), ev.getStartMark(),
-                ev.getEndMark(), ev.getStyle());
+        Node node = new ScalarNode(nodeTag, resolved, ev.getValue(), ev.getStartMark(), ev
+                .getEndMark(), ev.getStyle());
         if (anchor != null) {
             anchors.put(anchor, node);
         }
@@ -186,13 +187,14 @@
     private Node composeSequenceNode(String anchor) {
         SequenceStartEvent startEvent = (SequenceStartEvent) parser.getEvent();
         String tag = startEvent.getTag();
+        Tag nodeTag = Tag.createTag(tag);
         boolean resolved = false;
         if (tag == null || tag.equals("!")) {
-            tag = resolver.resolve(NodeId.sequence, null, startEvent.getImplicit());
+            nodeTag = resolver.resolve(NodeId.sequence, null, startEvent.getImplicit());
             resolved = true;
         }
-        SequenceNode node = new SequenceNode(Tag.createTag(tag), resolved, new ArrayList<Node>(),
-                startEvent.getStartMark(), null, startEvent.getFlowStyle());
+        SequenceNode node = new SequenceNode(nodeTag, resolved, new ArrayList<Node>(), startEvent
+                .getStartMark(), null, startEvent.getFlowStyle());
         if (anchor != null) {
             anchors.put(anchor, node);
         }
@@ -209,14 +211,14 @@
     private Node composeMappingNode(String anchor) {
         MappingStartEvent startEvent = (MappingStartEvent) parser.getEvent();
         String tag = startEvent.getTag();
+        Tag nodeTag = Tag.createTag(tag);
         boolean resolved = false;
         if (tag == null || tag.equals("!")) {
-            tag = resolver.resolve(NodeId.mapping, null, startEvent.getImplicit());
+            nodeTag = resolver.resolve(NodeId.mapping, null, startEvent.getImplicit());
             resolved = true;
         }
-        MappingNode node = new MappingNode(Tag.createTag(tag), resolved,
-                new ArrayList<NodeTuple>(), startEvent.getStartMark(), null, startEvent
-                        .getFlowStyle());
+        MappingNode node = new MappingNode(nodeTag, resolved, new ArrayList<NodeTuple>(),
+                startEvent.getStartMark(), null, startEvent.getFlowStyle());
         if (anchor != null) {
             anchors.put(anchor, node);
         }
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
index 057c8b5..cb2d904 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
@@ -34,6 +34,7 @@
 import org.yaml.snakeyaml.nodes.NodeTuple;
 import org.yaml.snakeyaml.nodes.ScalarNode;
 import org.yaml.snakeyaml.nodes.SequenceNode;
+import org.yaml.snakeyaml.nodes.Tag;
 
 /**
  * @see <a href="http://pyyaml.org/wiki/PyYAML">PyYAML</a> for more information
@@ -52,7 +53,7 @@
      * 2) implicit tag - when the runtime class of the instance is unknown (the
      * node has the Object.class)
      */
-    protected final Map<String, Construct> yamlConstructors = new HashMap<String, Construct>();
+    protected final Map<Tag, Construct> yamlConstructors = new HashMap<Tag, Construct>();
     /**
      * It maps the (explicit or implicit) tag to the Construct implementation.
      * It is used when no exact match found.
@@ -65,7 +66,7 @@
     private final ArrayList<RecursiveTuple<Map<Object, Object>, RecursiveTuple<Object, Object>>> maps2fill;
     private final ArrayList<RecursiveTuple<Set<Object>, Object>> sets2fill;
 
-    protected String rootTag;
+    protected Tag rootTag;
 
     public BaseConstructor() {
         constructedObjects = new HashMap<Node, Object>();
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 747cb6d..86efa52 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -72,7 +72,7 @@
         }
         this.yamlConstructors.put(null, new ConstructYamlObject());
         if (!Object.class.equals(theRoot)) {
-            rootTag = Tag.getGlobalTagForClass(theRoot);
+            rootTag = new Tag(theRoot);
         }
         typeTags = new HashMap<String, Class<? extends Object>>();
         typeDefinitions = new HashMap<Class<? extends Object>, TypeDescription>();
@@ -119,7 +119,7 @@
             throw new NullPointerException("TypeDescription is required.");
         }
         if (rootTag == null && definition.isRoot()) {
-            rootTag = Tag.getGlobalTagForClass(definition.getType());
+            rootTag = new Tag(definition.getType());
         }
         String tag = definition.getTag();
         typeTags.put(tag, definition.getType());
diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Tag.java b/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
index 9060d3c..a3d86ee 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
@@ -28,24 +28,24 @@
 

 public final class Tag {

     public static final String PREFIX = "tag:yaml.org,2002:";

-    public static final String YAML = PREFIX + "yaml";

-    public static final String VALUE = PREFIX + "value";

-    public static final String MERGE = PREFIX + "merge";

-    public static final String SET = PREFIX + "set";

-    public static final String PAIRS = PREFIX + "pairs";

-    public static final String OMAP = PREFIX + "omap";

-    public static final String BINARY = PREFIX + "binary";

-    public static final String INT = PREFIX + "int";

-    public static final String FLOAT = PREFIX + "float";

-    public static final String TIMESTAMP = PREFIX + "timestamp";

-    public static final String BOOL = PREFIX + "bool";

-    public static final String NULL = PREFIX + "null";

-    public static final String STR = PREFIX + "str";

-    public static final String SEQ = PREFIX + "seq";

-    public static final String MAP = PREFIX + "map";

-    public static final Map<String, Set<Class<?>>> COMPATIBILITY_MAP;

+    public static final Tag YAML = new Tag(PREFIX + "yaml");

+    public static final Tag VALUE = new Tag(PREFIX + "value");

+    public static final Tag MERGE = new Tag(PREFIX + "merge");

+    public static final Tag SET = new Tag(PREFIX + "set");

+    public static final Tag PAIRS = new Tag(PREFIX + "pairs");

+    public static final Tag OMAP = new Tag(PREFIX + "omap");

+    public static final Tag BINARY = new Tag(PREFIX + "binary");

+    public static final Tag INT = new Tag(PREFIX + "int");

+    public static final Tag FLOAT = new Tag(PREFIX + "float");

+    public static final Tag TIMESTAMP = new Tag(PREFIX + "timestamp");

+    public static final Tag BOOL = new Tag(PREFIX + "bool");

+    public static final Tag NULL = new Tag(PREFIX + "null");

+    public static final Tag STR = new Tag(PREFIX + "str");

+    public static final Tag SEQ = new Tag(PREFIX + "seq");

+    public static final Tag MAP = new Tag(PREFIX + "map");

+    public static final Map<Tag, Set<Class<?>>> COMPATIBILITY_MAP;

     static {

-        COMPATIBILITY_MAP = new HashMap<String, Set<Class<?>>>();

+        COMPATIBILITY_MAP = new HashMap<Tag, Set<Class<?>>>();

         Set<Class<?>> floatSet = new HashSet<Class<?>>();

         floatSet.add(Double.class);

         floatSet.add(Float.class);

@@ -80,7 +80,10 @@
     }

 

     public Tag(Class<? extends Object> clazz) {

-        this(Tag.PREFIX + clazz.getName());

+        if (clazz == null) {

+            throw new NullPointerException("Class for tag must be provided.");

+        }

+        this.value = Tag.PREFIX + clazz.getName();

     }

 

     public String getValue() {

@@ -136,7 +139,7 @@
      *         language-independent tag

      */

     public boolean isCompatible(Class<?> clazz) {

-        Set<Class<?>> set = COMPATIBILITY_MAP.get(value);

+        Set<Class<?>> set = COMPATIBILITY_MAP.get(Tag.createTag(value));

         if (set != null) {

             return set.contains(clazz);

         } else {

@@ -155,7 +158,4 @@
         return value.equals(Tag.PREFIX + clazz.getName());

     }

 

-    public static String getGlobalTagForClass(Class<? extends Object> clazz) {

-        return PREFIX + clazz.getName();

-    }

 }

diff --git a/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
index f12c35f..1dcc245 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
@@ -111,22 +111,22 @@
         return node;

     }

 

-    protected Node representScalar(String tag, String value, Character style) {

+    protected Node representScalar(Tag tag, String value, Character style) {

         if (style == null) {

             style = this.defaultStyle;

         }

-        Node node = new ScalarNode(Tag.createTag(tag), value, null, null, style);

+        Node node = new ScalarNode(tag, value, null, null, style);

         representedObjects.put(objectToRepresent, node);

         return node;

     }

 

-    protected Node representScalar(String tag, String value) {

+    protected Node representScalar(Tag tag, String value) {

         return representScalar(tag, value, null);

     }

 

-    protected Node representSequence(String tag, List<? extends Object> sequence, Boolean flowStyle) {

+    protected Node representSequence(Tag tag, List<? extends Object> sequence, Boolean flowStyle) {

         List<Node> value = new ArrayList<Node>(sequence.size());

-        SequenceNode node = new SequenceNode(Tag.createTag(tag), value, flowStyle);

+        SequenceNode node = new SequenceNode(tag, value, flowStyle);

         representedObjects.put(objectToRepresent, node);

         boolean bestStyle = true;

         for (Object item : sequence) {

@@ -146,10 +146,10 @@
         return node;

     }

 

-    protected Node representMapping(String tag, Map<? extends Object, Object> mapping,

+    protected Node representMapping(Tag tag, Map<? extends Object, Object> mapping,

             Boolean flowStyle) {

         List<NodeTuple> value = new ArrayList<NodeTuple>(mapping.size());

-        MappingNode node = new MappingNode(Tag.createTag(tag), value, flowStyle);

+        MappingNode node = new MappingNode(tag, value, flowStyle);

         representedObjects.put(objectToRepresent, node);

         boolean bestStyle = true;

         for (Object itemKey : mapping.keySet()) {

diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index 1c9dcc8..28ff5a9 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -85,11 +85,11 @@
      */
     protected Node representJavaBean(Set<Property> properties, Object javaBean) {
         List<NodeTuple> value = new ArrayList<NodeTuple>(properties.size());
-        String tag;
-        String customTag = classTags.get(javaBean.getClass());
-        tag = customTag != null ? customTag : Tag.getGlobalTagForClass(javaBean.getClass());
+        Tag tag;
+        Tag customTag = classTags.get(javaBean.getClass());
+        tag = customTag != null ? customTag : new Tag(javaBean.getClass());
         // flow style will be chosen by BaseRepresenter
-        MappingNode node = new MappingNode(Tag.createTag(tag), value, null);
+        MappingNode node = new MappingNode(tag, value, null);
         representedObjects.put(objectToRepresent, node);
         boolean bestStyle = true;
         for (Property property : properties) {
@@ -111,12 +111,12 @@
                         if (property.getType() == memberValue.getClass()) {
                             // we do not need global tag because the property
                             // Class is the same as the runtime class
-                            nodeValue.setTag(Tag.createTag(Tag.MAP));
+                            nodeValue.setTag(Tag.MAP);
                         }
                     }
                 }
             } else if (memberValue != null && Enum.class.isAssignableFrom(memberValue.getClass())) {
-                nodeValue.setTag(Tag.createTag(Tag.STR));
+                nodeValue.setTag(Tag.STR);
             }
             if (nodeValue.getNodeId() != NodeId.scalar && !hasAlias) {
                 // generic collections
@@ -162,7 +162,7 @@
                 for (Node childNode : snode.getValue()) {
                     Object member = iter.next();
                     if (t.equals(member.getClass()) && childNode.getNodeId() == NodeId.mapping) {
-                        childNode.setTag(Tag.createTag(Tag.MAP));
+                        childNode.setTag(Tag.MAP);
                     }
                 }
             } else if (object instanceof Set) {
@@ -174,7 +174,7 @@
                     NodeTuple tuple = iter.next();
                     if (t.equals(member.getClass())
                             && tuple.getKeyNode().getNodeId() == NodeId.mapping) {
-                        tuple.getKeyNode().setTag(Tag.createTag(Tag.MAP));
+                        tuple.getKeyNode().setTag(Tag.MAP);
                     }
                 }
             } else if (node.getNodeId() == NodeId.mapping) {
@@ -193,9 +193,9 @@
         Tag tag = node.getTag();
         if (tag.matches(type)) {
             if (Enum.class.isAssignableFrom(type)) {
-                node.setTag(Tag.createTag(Tag.STR));
+                node.setTag(Tag.STR);
             } else {
-                node.setTag(Tag.createTag(Tag.MAP));
+                node.setTag(Tag.MAP);
             }
         }
     }
diff --git a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
index e69037c..1050696 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
@@ -38,7 +38,7 @@
  */

 class SafeRepresenter extends BaseRepresenter {

 

-    protected Map<Class<? extends Object>, String> classTags;

+    protected Map<Class<? extends Object>, Tag> classTags;

 

     public SafeRepresenter() {

         this.nullRepresenter = new RepresentNull();

@@ -53,10 +53,10 @@
         this.multiRepresenters.put(new Object[0].getClass(), new RepresentArray());

         this.multiRepresenters.put(Date.class, new RepresentDate());

         this.multiRepresenters.put(Enum.class, new RepresentEnum());

-        classTags = new HashMap<Class<? extends Object>, String>();

+        classTags = new HashMap<Class<? extends Object>, Tag>();

     }

 

-    private String getTag(Class<?> clazz, String defaultTag) {

+    private Tag getTag(Class<?> clazz, Tag defaultTag) {

         if (classTags.containsKey(clazz)) {

             return classTags.get(clazz);

         } else {

@@ -83,6 +83,7 @@
     /**

      * Define a tag for the <code>Class</code> to serialize

      * 

+     * @deprecated use Tag instead of String

      * @param clazz

      *            <code>Class</code> which tag is changed

      * @param tag

@@ -90,7 +91,11 @@
      *            <code>Class</code>

      * @return the previous tag associated with the <code>Class</code>

      */

-    public String addClassTag(Class<? extends Object> clazz, String tag) {

+    public Tag addClassTag(Class<? extends Object> clazz, String tag) {

+        return addClassTag(clazz, Tag.createTag(tag));

+    }

+

+    public Tag addClassTag(Class<? extends Object> clazz, Tag tag) {

         if (tag == null) {

             throw new NullPointerException("Tag must be provided.");

         }

@@ -107,7 +112,7 @@
 

     private class RepresentString implements Represent {

         public Node representData(Object data) {

-            String tag = Tag.STR;

+            Tag tag = Tag.STR;

             Character style = null;

             String value = data.toString();

             if (BINARY_PATTERN.matcher(value).find()) {

@@ -135,7 +140,7 @@
 

     private class RepresentNumber implements Represent {

         public Node representData(Object data) {

-            String tag;

+            Tag tag;

             String value;

             if (data instanceof Byte || data instanceof Short || data instanceof Integer

                     || data instanceof Long || data instanceof BigInteger) {

@@ -248,7 +253,7 @@
 

     private class RepresentEnum implements Represent {

         public Node representData(Object data) {

-            String tag = Tag.getGlobalTagForClass(data.getClass());

+            Tag tag = new Tag(data.getClass());

             return representScalar(getTag(data.getClass(), tag), data.toString());

         }

     }

diff --git a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
index b534824..434b5dc 100644
--- a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
+++ b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
@@ -80,7 +80,7 @@
         this(true);
     }
 
-    public void addImplicitResolver(String tag, Pattern regexp, String first) {
+    public void addImplicitResolver(Tag tag, Pattern regexp, String first) {
         if (first == null) {
             List<ResolverTuple> curr = yamlImplicitResolvers.get(null);
             if (curr == null) {
@@ -106,7 +106,7 @@
         }
     }
 
-    public String resolve(NodeId kind, String value, boolean implicit) {
+    public Tag resolve(NodeId kind, String value, boolean implicit) {
         if (kind == NodeId.scalar && implicit) {
             List<ResolverTuple> resolvers = null;
             if ("".equals(value)) {
@@ -116,7 +116,7 @@
             }
             if (resolvers != null) {
                 for (ResolverTuple v : resolvers) {
-                    String tag = v.getTag();
+                    Tag tag = v.getTag();
                     Pattern regexp = v.getRegexp();
                     if (regexp.matcher(value).matches()) {
                         return tag;
@@ -125,7 +125,7 @@
             }
             if (yamlImplicitResolvers.containsKey(null)) {
                 for (ResolverTuple v : yamlImplicitResolvers.get(null)) {
-                    String tag = v.getTag();
+                    Tag tag = v.getTag();
                     Pattern regexp = v.getRegexp();
                     if (regexp.matcher(value).matches()) {
                         return tag;
diff --git a/src/main/java/org/yaml/snakeyaml/resolver/ResolverTuple.java b/src/main/java/org/yaml/snakeyaml/resolver/ResolverTuple.java
index d3c89cb..11ee46f 100644
--- a/src/main/java/org/yaml/snakeyaml/resolver/ResolverTuple.java
+++ b/src/main/java/org/yaml/snakeyaml/resolver/ResolverTuple.java
@@ -17,16 +17,18 @@
 

 import java.util.regex.Pattern;

 

+import org.yaml.snakeyaml.nodes.Tag;

+

 final class ResolverTuple {

-    private final String tag;

+    private final Tag tag;

     private final Pattern regexp;

 

-    public ResolverTuple(String tag, Pattern regexp) {

+    public ResolverTuple(Tag tag, Pattern regexp) {

         this.tag = tag;

         this.regexp = regexp;

     }

 

-    public String getTag() {

+    public Tag getTag() {

         return tag;

     }

 

diff --git a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
index d162a83..911c4b7 100644
--- a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
+++ b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
@@ -60,7 +60,7 @@
     private Map<Node, String> anchors;
     private int lastAnchorId;
     private Boolean closed;
-    private String explicitRoot;
+    private Tag explicitRoot;
 
     public Serializer(Emitter emitter, Resolver resolver, DumperOptions opts) {
         this.emitter = emitter;
@@ -108,7 +108,7 @@
                 useTags));
         anchorNode(node);
         if (explicitRoot != null) {
-            node.setTag(Tag.createTag(explicitRoot));
+            node.setTag(explicitRoot);
         }
         serializeNode(node, null, null);
         this.emitter.emit(new DocumentEndEvent(null, null, this.explicitEnd));
@@ -167,10 +167,8 @@
             switch (node.getNodeId()) {
             case scalar:
                 ScalarNode scalarNode = (ScalarNode) node;
-                String detectedTag = this.resolver.resolve(NodeId.scalar, scalarNode.getValue(),
-                        true);
-                String defaultTag = this.resolver.resolve(NodeId.scalar, scalarNode.getValue(),
-                        false);
+                Tag detectedTag = this.resolver.resolve(NodeId.scalar, scalarNode.getValue(), true);
+                Tag defaultTag = this.resolver.resolve(NodeId.scalar, scalarNode.getValue(), false);
                 ImplicitTuple tuple = new ImplicitTuple(node.getTag().equals(detectedTag), node
                         .getTag().equals(defaultTag));
                 ScalarEvent event = new ScalarEvent(tAlias, node.getTag().getValue(), tuple,
@@ -192,7 +190,7 @@
                 this.emitter.emit(new SequenceEndEvent(null, null));
                 break;
             default:// instance of MappingNode
-                String implicitTag = this.resolver.resolve(NodeId.mapping, null, true);
+                Tag implicitTag = this.resolver.resolve(NodeId.mapping, null, true);
                 boolean implicitM = (node.getTag().equals(implicitTag));
                 this.emitter.emit(new MappingStartEvent(tAlias, node.getTag().getValue(),
                         implicitM, null, null, ((CollectionNode) node).getFlowStyle()));
diff --git a/src/test/java/examples/DiceExampleTest.java b/src/test/java/examples/DiceExampleTest.java
index 55042b7..97e2e39 100644
--- a/src/test/java/examples/DiceExampleTest.java
+++ b/src/test/java/examples/DiceExampleTest.java
@@ -30,6 +30,7 @@
 import org.yaml.snakeyaml.constructor.SafeConstructor;

 import org.yaml.snakeyaml.nodes.Node;

 import org.yaml.snakeyaml.nodes.ScalarNode;

+import org.yaml.snakeyaml.nodes.Tag;

 import org.yaml.snakeyaml.representer.Represent;

 import org.yaml.snakeyaml.representer.Representer;

 

@@ -59,14 +60,14 @@
             public Node representData(Object data) {

                 Dice dice = (Dice) data;

                 String value = dice.getA() + "d" + dice.getB();

-                return representScalar("!dice", value);

+                return representScalar(Tag.createTag("!dice"), value);

             }

         }

     }

 

     class DiceConstructor extends SafeConstructor {

         public DiceConstructor() {

-            this.yamlConstructors.put("!dice", new ConstructDice());

+            this.yamlConstructors.put(Tag.createTag("!dice"), new ConstructDice());

         }

 

         private class ConstructDice extends AbstractConstruct {

diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java
index f35ebce..1b1f425 100644
--- a/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java
@@ -31,6 +31,7 @@
 import org.yaml.snakeyaml.constructor.Constructor;

 import org.yaml.snakeyaml.nodes.Node;

 import org.yaml.snakeyaml.nodes.ScalarNode;

+import org.yaml.snakeyaml.nodes.Tag;

 

 /**

  * Test Chapter 2.4 from the YAML specification

@@ -130,7 +131,7 @@
 

     class SomethingConstructor extends Constructor {

         public SomethingConstructor() {

-            this.yamlConstructors.put("!something", new ConstructSomething());

+            this.yamlConstructors.put(Tag.createTag("!something"), new ConstructSomething());

         }

 

         private class ConstructSomething extends AbstractConstruct {

diff --git a/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java b/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java
index 1a563ce..f485ffa 100644
--- a/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java
+++ b/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java
@@ -310,7 +310,7 @@
     public void testSetRootTag() {
         DumperOptions options = new DumperOptions();
         try {
-            options.setExplicitRoot(null);
+            options.setExplicitRoot((Tag) null);
             fail("Root tag is required.");
         } catch (NullPointerException e) {
             assertEquals("Root tag must be specified.", e.getMessage());
diff --git a/src/test/java/org/yaml/snakeyaml/Example2_24Test.java b/src/test/java/org/yaml/snakeyaml/Example2_24Test.java
index f68ba08..396456a 100644
--- a/src/test/java/org/yaml/snakeyaml/Example2_24Test.java
+++ b/src/test/java/org/yaml/snakeyaml/Example2_24Test.java
@@ -40,10 +40,14 @@
 public class Example2_24Test extends TestCase {

     class MyConstructor extends Constructor {

         public MyConstructor() {

-            this.yamlConstructors.put("tag:clarkevans.com,2002:shape", new ConstructShape());

-            this.yamlConstructors.put("tag:clarkevans.com,2002:circle", new ConstructCircle());

-            this.yamlConstructors.put("tag:clarkevans.com,2002:line", new ConstructLine());

-            this.yamlConstructors.put("tag:clarkevans.com,2002:label", new ConstructLabel());

+            this.yamlConstructors.put(Tag.createTag("tag:clarkevans.com,2002:shape"),

+                    new ConstructShape());

+            this.yamlConstructors.put(Tag.createTag("tag:clarkevans.com,2002:circle"),

+                    new ConstructCircle());

+            this.yamlConstructors.put(Tag.createTag("tag:clarkevans.com,2002:line"),

+                    new ConstructLine());

+            this.yamlConstructors.put(Tag.createTag("tag:clarkevans.com,2002:label"),

+                    new ConstructLabel());

         }

 

         private class ConstructShape extends AbstractConstruct {

@@ -102,7 +106,7 @@
             public Node representData(Object data) {

                 Shape shape = (Shape) data;

                 List<Entity> value = shape.getEntities();

-                return representSequence("!shape", value, Boolean.FALSE);

+                return representSequence(Tag.createTag("!shape"), value, Boolean.FALSE);

             }

         }

 

@@ -112,7 +116,7 @@
                 Map<String, Object> map = new TreeMap<String, Object>();

                 map.put("center", circle.getCenter());

                 map.put("radius", circle.getRadius());

-                return representMapping("!circle", map, Boolean.FALSE);

+                return representMapping(Tag.createTag("!circle"), map, Boolean.FALSE);

             }

         }

 

@@ -122,7 +126,7 @@
                 Map<String, Object> map = new TreeMap<String, Object>();

                 map.put("start", line.getStart());

                 map.put("finish", line.getFinish());

-                return representMapping("!line", map, Boolean.FALSE);

+                return representMapping(Tag.createTag("!line"), map, Boolean.FALSE);

             }

         }

 

@@ -133,7 +137,7 @@
                 map.put("start", label.getStart());

                 map.put("color", new HexInteger(label.getColor()));

                 map.put("text", label.getText());

-                return representMapping("!label", map, Boolean.FALSE);

+                return representMapping(Tag.createTag("!label"), map, Boolean.FALSE);

             }

         }

 

diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
index ca04420..6a91217 100644
--- a/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
+++ b/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
@@ -159,26 +159,28 @@
 
         private class RepresentFloat implements Represent {
             public Node representData(Object data) {
-                return representScalar(Tag.PREFIX + "java.lang.Float", ((Float) data).toString());
+                return representScalar(Tag.createTag(Tag.PREFIX + "java.lang.Float"),
+                        ((Float) data).toString());
             }
         }
 
         private class RepresentLong implements Represent {
             public Node representData(Object data) {
-                return representScalar(Tag.PREFIX + "java.lang.Long", ((Long) data).toString());
+                return representScalar(Tag.createTag(Tag.PREFIX + "java.lang.Long"), ((Long) data)
+                        .toString());
             }
         }
 
         private class RepresentDate implements Represent {
             public Node representData(Object data) {
-                return representScalar(Tag.PREFIX + "java.sql.Date", ((java.sql.Date) data)
-                        .toString());
+                return representScalar(Tag.createTag(Tag.PREFIX + "java.sql.Date"),
+                        ((java.sql.Date) data).toString());
             }
         }
 
         private class RepresentTime implements Represent {
             public Node representData(Object data) {
-                return representScalar(Tag.PREFIX + "java.sql.Timestamp",
+                return representScalar(Tag.createTag(Tag.PREFIX + "java.sql.Timestamp"),
                         ((java.sql.Timestamp) data).toString());
             }
         }
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/PrefixConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/PrefixConstructorTest.java
index 90b4f6d..7a93a7f 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/PrefixConstructorTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/PrefixConstructorTest.java
@@ -24,6 +24,7 @@
 import org.yaml.snakeyaml.nodes.Node;

 import org.yaml.snakeyaml.nodes.ScalarNode;

 import org.yaml.snakeyaml.nodes.SequenceNode;

+import org.yaml.snakeyaml.nodes.Tag;

 

 /**

  * Example to process a family of tags with the same prefix with one constructor

@@ -61,8 +62,8 @@
             this.yamlMultiConstructors.put(prefix, new PrefixConstruct(prefix,

                     CustomConstructor.this));

             this.yamlConstructors.put(null, new ConstructUnknown(CustomConstructor.this));

-            this.yamlConstructors

-                    .put("!org.yaml.Exact", new ExactConstruct(CustomConstructor.this));

+            this.yamlConstructors.put(Tag.createTag("!org.yaml.Exact"), new ExactConstruct(

+                    CustomConstructor.this));

         }

     }

 

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue11/YamlMapTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue11/YamlMapTest.java
index 9eb556a..828fa17 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue11/YamlMapTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue11/YamlMapTest.java
@@ -29,6 +29,7 @@
 import org.yaml.snakeyaml.constructor.Constructor;

 import org.yaml.snakeyaml.nodes.Node;

 import org.yaml.snakeyaml.nodes.ScalarNode;

+import org.yaml.snakeyaml.nodes.Tag;

 import org.yaml.snakeyaml.representer.Represent;

 import org.yaml.snakeyaml.representer.Representer;

 

@@ -130,14 +131,14 @@
 

         private class RepresentCustom implements Represent {

             public Node representData(Object data) {

-                return representScalar("!Custom", ((Custom) data).toString());

+                return representScalar(Tag.createTag("!Custom"), ((Custom) data).toString());

             }

         }

     }

 

     public static class ExtendedConstructor extends Constructor {

         public ExtendedConstructor() {

-            this.yamlConstructors.put("!Custom", new ConstructCustom());

+            this.yamlConstructors.put(Tag.createTag("!Custom"), new ConstructCustom());

         }

 

         private class ConstructCustom extends AbstractConstruct {

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java
index 7e2ba7f..1e73958 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java
@@ -25,9 +25,8 @@
 

     public BeanConstructor() {

         super(BeanHolder.class);

-        yamlConstructors.put(Tag.getGlobalTagForClass(Bean1.class), new Bean1ScalarConstructor());

-        yamlConstructors.put(Tag.getGlobalTagForClass(BeanHolder.class),

-                new BeanHolderScalarConstructor());

+        yamlConstructors.put(new Tag(Bean1.class), new Bean1ScalarConstructor());

+        yamlConstructors.put(new Tag(BeanHolder.class), new BeanHolderScalarConstructor());

     }

 

     private class Bean1ScalarConstructor extends ConstructScalar {

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor3.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor3.java
index e5289d0..05722e0 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor3.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor3.java
@@ -22,8 +22,7 @@
 public class BeanConstructor3 extends Constructor {

 

     public BeanConstructor3() {

-        yamlConstructors.put(Tag.getGlobalTagForClass(BeanHolder.class),

-                new BeanHolderScalarConstructor());

+        yamlConstructors.put(new Tag(BeanHolder.class), new BeanHolderScalarConstructor());

     }

 

     private class BeanHolderScalarConstructor extends ConstructScalar {

diff --git a/src/test/java/org/yaml/snakeyaml/nodes/NodeTupleTest.java b/src/test/java/org/yaml/snakeyaml/nodes/NodeTupleTest.java
index b423129..a2d6a79 100644
--- a/src/test/java/org/yaml/snakeyaml/nodes/NodeTupleTest.java
+++ b/src/test/java/org/yaml/snakeyaml/nodes/NodeTupleTest.java
@@ -40,8 +40,8 @@
     }

 

     public void testToString() {

-        Node key = new ScalarNode(Tag.createTag(Tag.STR), "key1", null, null, null);

-        Node value = new ScalarNode(Tag.createTag(Tag.STR), "value1", null, null, null);

+        Node key = new ScalarNode(Tag.STR, "key1", null, null, null);

+        Node value = new ScalarNode(Tag.STR, "value1", null, null, null);

         NodeTuple tuple = new NodeTuple(key, value);

         assertEquals(

                 "<NodeTuple keyNode=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=key1)>; valueNode=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=value1)>>",

diff --git a/src/test/java/org/yaml/snakeyaml/nodes/TagsTest.java b/src/test/java/org/yaml/snakeyaml/nodes/TagsTest.java
index fe7da84..13ad758 100644
--- a/src/test/java/org/yaml/snakeyaml/nodes/TagsTest.java
+++ b/src/test/java/org/yaml/snakeyaml/nodes/TagsTest.java
@@ -23,9 +23,9 @@
 public class TagsTest extends TestCase {

 

     public void testGetGlobalTagForClass() {

-        assertEquals("tag:yaml.org,2002:java.lang.String", Tag.getGlobalTagForClass(String.class));

-        assertEquals("tag:yaml.org,2002:org.yaml.snakeyaml.nodes.TagsTest", Tag

-                .getGlobalTagForClass(TagsTest.class));

+        assertEquals(Tag.createTag("tag:yaml.org,2002:java.lang.String"), new Tag(String.class));

+        assertEquals(Tag.createTag("tag:yaml.org,2002:org.yaml.snakeyaml.nodes.TagsTest"), new Tag(

+                TagsTest.class));

     }

 

     /**

diff --git a/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java b/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java
index e6d137f..75d9bea 100644
--- a/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java
+++ b/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java
@@ -75,14 +75,14 @@
             public Node representData(Object data) {

                 CustomBean coin = (CustomBean) data;

                 String value = coin.getPrefix() + "d" + coin.getSuffix();

-                return representScalar("!!Dice", value);

+                return representScalar(Tag.createTag("!!Dice"), value);

             }

         }

     }

 

     class MyConstructor extends Constructor {

         public MyConstructor() {

-            this.yamlConstructors.put(Tag.PREFIX + "Dice", new ConstructDice());

+            this.yamlConstructors.put(Tag.createTag(Tag.PREFIX + "Dice"), new ConstructDice());

         }

 

         private class ConstructDice extends AbstractConstruct {

diff --git a/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java b/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java
index e2bc853..279590f 100644
--- a/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java
+++ b/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java
@@ -18,6 +18,7 @@
 import junit.framework.TestCase;

 

 import org.yaml.snakeyaml.Yaml;

+import org.yaml.snakeyaml.nodes.Tag;

 

 public class RepresenterTest extends TestCase {

 

@@ -134,7 +135,7 @@
     public void testRepresenterAddNull() {

         Representer representer = new Representer();

         try {

-            representer.addClassTag(EmptyBean.class, null);

+            representer.addClassTag(EmptyBean.class, (Tag) null);

             fail("Tag must be provided.");

         } catch (Exception e) {

             assertEquals("Tag must be provided.", e.getMessage());

diff --git a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java
index 19a177e..30f646f 100644
--- a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java
+++ b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java
@@ -111,14 +111,14 @@
             public Node representData(Object data) {

                 Phone phone = (Phone) data;

                 String value = phone.getNumber();

-                return representScalar(Tag.PREFIX + "Phone", value);

+                return representScalar(Tag.createTag(Tag.PREFIX + "Phone"), value);

             }

         }

     }

 

     class MyConstructor extends Constructor {

         public MyConstructor() {

-            this.yamlConstructors.put(Tag.PREFIX + "Phone", new ConstructPhone());

+            this.yamlConstructors.put(Tag.createTag(Tag.PREFIX + "Phone"), new ConstructPhone());

         }

 

         private class ConstructPhone extends AbstractConstruct {

@@ -139,7 +139,7 @@
             public Node representData(Object data) {

                 Point phone = (Point) data;

                 String value = "x" + (int) phone.getX() + "_y" + (int) phone.getY();

-                return representScalar(Tag.PREFIX + "Point", value);

+                return representScalar(Tag.createTag(Tag.PREFIX + "Point"), value);

             }

         }

 

@@ -147,7 +147,7 @@
             public Node representData(Object data) {

                 Phone phone = (Phone) data;

                 String value = phone.getNumber();

-                return representScalar(Tag.PREFIX + "Phone", value);

+                return representScalar(Tag.createTag(Tag.PREFIX + "Phone"), value);

             }

         }

     }

diff --git a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java
index bdeb2ae..0688ae3 100644
--- a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java
+++ b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java
@@ -19,10 +19,12 @@
 

 import junit.framework.TestCase;

 

+import org.yaml.snakeyaml.nodes.Tag;

+

 public class ResolverTupleTest extends TestCase {

 

     public void testToString() {

-        ResolverTuple tuple = new ResolverTuple("dice", Pattern.compile("\\d+"));

+        ResolverTuple tuple = new ResolverTuple(Tag.createTag("dice"), Pattern.compile("\\d+"));

         assertEquals("Tuple tag=dice regexp=\\d+", tuple.toString());

     }

 }