Fix issue 183: Support Number class
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f45f804..c9f671d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
     </properties>
     <body>
         <release version="1.14-SNAPSHOT" date="in Mercurial" description="Maintenance">
+             <action dev="py4fun" type="fix"  issue="183">
+                Support Number class (2013-11-07)
+             </action>
              <action dev="py4fun" type="fix"  issue="182">
                 Double.POSITIVE_INFINITY applied to float fields (2013-11-07)
              </action>
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 847aa7e..c135504 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -492,6 +492,9 @@
                 ConstructYamlTimestamp contr = new ConstructYamlTimestamp();
                 contr.construct(node);
                 result = contr.getCalendar();
+            } else if (Number.class.isAssignableFrom(type)) {
+                ConstructYamlNumber contr = new ConstructYamlNumber();
+                result = contr.construct(node);
             } else {
                 throw new YAMLException("Unsupported class: " + type);
             }
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
index e8f4214..1ce65c1 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
@@ -16,6 +16,8 @@
 package org.yaml.snakeyaml.constructor;
 
 import java.math.BigInteger;
+import java.text.NumberFormat;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collections;
@@ -271,6 +273,20 @@
         }
     }
 
+    public static class ConstructYamlNumber extends AbstractConstruct {
+        private final NumberFormat nf = NumberFormat.getInstance();
+
+        public Object construct(Node node) {
+            ScalarNode scalar = (ScalarNode) node;
+            try {
+                return nf.parse(scalar.getValue());
+            } catch (ParseException e) {
+                throw new IllegalArgumentException("Unable to parse as Number: "
+                        + scalar.getValue());
+            }
+        }
+    }
+
     private final static Pattern TIMESTAMP_REGEXP = Pattern
             .compile("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \t]*(?:Z|([-+][0-9][0-9]?)(?::([0-9][0-9])?)?))?)?$");
     private final static Pattern YMD_REGEXP = Pattern
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
index 9303b96..0c51e2d 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
@@ -52,8 +52,7 @@
             yaml.load(className);
             fail("AtomicLong is not supported.");
         } catch (Exception e) {
-            assertEquals("Unsupported class: class java.util.concurrent.atomic.AtomicLong", e
-                    .getCause().getMessage());
+            assertEquals("argument type mismatch", e.getCause().getMessage());
         }
     }
 }
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java
new file mode 100644
index 0000000..6ac984f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java
@@ -0,0 +1,20 @@
+/**

+ * Copyright (c) 2008-2013, 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.issues.issue183;

+

+public class NumberBean {

+    public Number number;

+}

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java
new file mode 100644
index 0000000..8842a3c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java
@@ -0,0 +1,34 @@
+/**

+ * Copyright (c) 2008-2013, 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.issues.issue183;

+

+import junit.framework.TestCase;

+

+import org.yaml.snakeyaml.Yaml;

+

+public class NumberBeanTest extends TestCase {

+

+    public void testInfinityFloatBean() throws Exception {

+

+        NumberBean number = new NumberBean();

+        number.number = 1;

+

+        Yaml yaml = new Yaml();

+        String dump = yaml.dump(number);

+        NumberBean loaded = yaml.loadAs(dump, NumberBean.class);

+        assertEquals(new Long(1), loaded.number);

+    }

+}