restore removed code back to Constructor, add more tests
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index c63c800..77cfcf5 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -324,6 +324,10 @@
 
     private Object createEmptyJavaBean(Node node) {
         try {
+            Class<? extends Object> type = node.getType();
+            if (Modifier.isAbstract(type.getModifiers())) {
+                node.setType(getClassForNode(node));
+            }
             /**
              * Using only default constructor. Everything else will be
              * initialized on 2nd step. If we do here some partial
@@ -336,6 +340,8 @@
             throw new YAMLException(e);
         } catch (IllegalAccessException e) {
             throw new YAMLException(e);
+        } catch (ClassNotFoundException e) {
+            throw new YAMLException(e);
         }
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java b/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java
new file mode 100644
index 0000000..30d3d54
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java
@@ -0,0 +1,9 @@
+/*

+ * See LICENSE file in distribution for copyright and licensing information.

+ */

+package org.yaml.snakeyaml.javabeans;

+

+public interface Shape {

+

+    public int process();

+}

diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java b/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java
new file mode 100644
index 0000000..d5abf8c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java
@@ -0,0 +1,20 @@
+/*

+ * See LICENSE file in distribution for copyright and licensing information.

+ */

+package org.yaml.snakeyaml.javabeans;

+

+public class Triangle implements Shape {

+    private String name;

+

+    public String getName() {

+        return name;

+    }

+

+    public void setName(String name) {

+        this.name = name;

+    }

+

+    public int process() {

+        return 7;

+    }

+}

diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java
new file mode 100644
index 0000000..d51e0b8
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java
@@ -0,0 +1,25 @@
+/*

+ * See LICENSE file in distribution for copyright and licensing information.

+ */

+package org.yaml.snakeyaml.javabeans;

+

+public class TriangleBean {

+    private String name;

+    private Shape shape;

+

+    public String getName() {

+        return name;

+    }

+

+    public void setName(String name) {

+        this.name = name;

+    }

+

+    public Shape getShape() {

+        return shape;

+    }

+

+    public void setShape(Shape shape) {

+        this.shape = shape;

+    }

+}

diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
new file mode 100644
index 0000000..bd1d7b1
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
@@ -0,0 +1,60 @@
+/*

+ * See LICENSE file in distribution for copyright and licensing information.

+ */

+package org.yaml.snakeyaml.javabeans;

+

+import junit.framework.TestCase;

+

+import org.yaml.snakeyaml.JavaBeanDumper;

+import org.yaml.snakeyaml.JavaBeanLoader;

+

+public class TriangleBeanTest extends TestCase {

+

+    public void testGetTriangle() {

+        Triangle triangle = new Triangle();

+        triangle.setName("Triangle25");

+        TriangleBean bean = new TriangleBean();

+        bean.setShape(triangle);

+        bean.setName("Bean25");

+        JavaBeanDumper beanDumper = new JavaBeanDumper();

+        String output = beanDumper.dump(bean);

+        System.out.println(output);

+        assertEquals(

+                "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n  name: Triangle25\n",

+                output);

+        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(

+                TriangleBean.class);

+        TriangleBean loadedBean = beanLoader.load(output);

+        assertNotNull(loadedBean);

+        assertEquals("Bean25", loadedBean.getName());

+        assertEquals(7, loadedBean.getShape().process());

+    }

+

+    public void testClassNotFound() {

+        String output = "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle777\n  name: Triangle25\n";

+        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(

+                TriangleBean.class);

+        try {

+            beanLoader.load(output);

+            fail("Class not found expected.");

+        } catch (Exception e) {

+            assertEquals(

+                    "org.yaml.snakeyaml.error.YAMLException: java.lang.ClassNotFoundException: org.yaml.snakeyaml.javabeans.Triangle777",

+                    e.getMessage());

+        }

+    }

+

+    /**

+     * Runtime class is more important then the tag (which is ignored if the

+     * class is known)

+     */

+    public void testClassAndTag() {

+        String output = "name: !!whatever Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n  name: Triangle25\n";

+        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(

+                TriangleBean.class);

+        TriangleBean loadedBean = beanLoader.load(output);

+        assertNotNull(loadedBean);

+        assertEquals("Bean25", loadedBean.getName());

+        assertEquals(7, loadedBean.getShape().process());

+    }

+}