Extend Resolver to support custom implicit types
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 34efbee..a56dc96 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,8 +7,8 @@
 	</properties>

 	<body>

 		<release version="1.5rc1" date="2009-10-23" description="Improve usage of generic collections in JavaBeans">

-		    <action dev="py4fun" type="update">

-                Make regular expressions in Resolver public to support custom implicit types (2009-10-27)

+            <action dev="py4fun" type="fix" issue="27" due-to="Polyglot Maven team">

+                Extend Resolver to support custom implicit types (2009-10-27)

             </action>

             <action dev="py4fun" type="update">

                 Performance improvement: use ArrayStack instead of Stack which extends Vector (2009-10-20)

diff --git a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
index 911b977..f4a6cb2 100644
--- a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
+++ b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
@@ -55,22 +55,26 @@
      */
     public Resolver(boolean respectDefaultImplicitScalars) {
         if (respectDefaultImplicitScalars) {
-            addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");
-            addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");
-            addImplicitResolver(Tags.INT, INT, "-+0123456789");
-            addImplicitResolver(Tags.MERGE, MERGE, "<");
-            addImplicitResolver(Tags.NULL, NULL, "~nN\0");
-            addImplicitResolver(Tags.NULL, EMPTY, null);
-            addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");
-            addImplicitResolver(Tags.VALUE, VALUE, "=");
-            // The following implicit resolver is only for documentation
-            // purposes.
-            // It cannot work
-            // because plain scalars cannot start with '!', '&', or '*'.
-            addImplicitResolver(Tags.YAML, YAML, "!&*");
+            addImplicitResolvers();
         }
     }
 
+    protected void addImplicitResolvers() {
+        addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");
+        addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");
+        addImplicitResolver(Tags.INT, INT, "-+0123456789");
+        addImplicitResolver(Tags.MERGE, MERGE, "<");
+        addImplicitResolver(Tags.NULL, NULL, "~nN\0");
+        addImplicitResolver(Tags.NULL, EMPTY, null);
+        addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");
+        addImplicitResolver(Tags.VALUE, VALUE, "=");
+        // The following implicit resolver is only for documentation
+        // purposes.
+        // It cannot work
+        // because plain scalars cannot start with '!', '&', or '*'.
+        addImplicitResolver(Tags.YAML, YAML, "!&*");
+    }
+
     public Resolver() {
         this(true);
     }
diff --git a/src/test/java/examples/resolver/CustomResolver.java b/src/test/java/examples/resolver/CustomResolver.java
new file mode 100644
index 0000000..7b2e5cf
--- /dev/null
+++ b/src/test/java/examples/resolver/CustomResolver.java
@@ -0,0 +1,36 @@
+/**

+ * Copyright (c) 2008-2009 Andrey Somov

+ *

+ * 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 examples.resolver;

+

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

+import org.yaml.snakeyaml.resolver.Resolver;

+

+public class CustomResolver extends Resolver {

+

+    /*

+     * do not resolve float and timestamp

+     */

+    protected void addImplicitResolvers() {

+        addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");

+        // addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");

+        addImplicitResolver(Tags.INT, INT, "-+0123456789");

+        addImplicitResolver(Tags.MERGE, MERGE, "<");

+        addImplicitResolver(Tags.NULL, NULL, "~nN\0");

+        addImplicitResolver(Tags.NULL, EMPTY, null);

+        // addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");

+        addImplicitResolver(Tags.VALUE, VALUE, "=");

+    }

+}

diff --git a/src/test/java/examples/resolver/CustomResolverTest.java b/src/test/java/examples/resolver/CustomResolverTest.java
new file mode 100644
index 0000000..2a50c13
--- /dev/null
+++ b/src/test/java/examples/resolver/CustomResolverTest.java
@@ -0,0 +1,54 @@
+/**

+ * Copyright (c) 2008-2009 Andrey Somov

+ *

+ * 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 examples.resolver;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import junit.framework.TestCase;

+

+import org.yaml.snakeyaml.Dumper;

+import org.yaml.snakeyaml.DumperOptions;

+import org.yaml.snakeyaml.Loader;

+import org.yaml.snakeyaml.Yaml;

+

+public class CustomResolverTest extends TestCase {

+

+    public void testResolverToDump() {

+        Map<Object, Object> map = new HashMap<Object, Object>();

+        map.put("1.0", "2009-01-01");

+        Yaml yaml = new Yaml(new Loader(), new Dumper(new DumperOptions()), new CustomResolver());

+        String output = yaml.dump(map);

+        assertEquals("{1.0: 2009-01-01}\n", output);

+        assertEquals("Float and Date must be excaped.", "{'1.0': '2009-01-01'}\n", new Yaml()

+                .dump(map));

+    }

+

+    @SuppressWarnings("unchecked")

+    public void testResolverToLoad() {

+        Yaml yaml = new Yaml(new Loader(), new Dumper(new DumperOptions()), new CustomResolver());

+        Map<Object, Object> map = (Map<Object, Object>) yaml.load("1.0: 2009-01-01");

+        assertEquals(1, map.size());

+        assertEquals("2009-01-01", map.get("1.0"));

+        //

+        Yaml yaml2 = new Yaml();

+        Map<Object, Object> map2 = (Map<Object, Object>) yaml2.load("1.0: 2009-01-01");

+        assertEquals(1, map2.size());

+        assertFalse(map2.containsKey("1.0"));

+        assertTrue(map2.toString(), map2.containsKey(new Double(1.0)));

+    }

+

+}