// Path: src/main/java/com/jajja/jorm/patch/postgres/FixedPGmoney.java
// @SuppressWarnings("serial")
// public class FixedPGmoney extends org.postgresql.util.PGmoney {
//     public FixedPGmoney() {
//         super();
//     }
// 
//     public FixedPGmoney(org.postgresql.util.PGmoney o) {
//         super();
//         setType(o.getType());
//         try {
//             setValue(o.getValue());
//         } catch (SQLException e) {
//             throw new RuntimeException(e);
//         }
//         val = o.val;
//     }
// 
//     @Override
//     public int hashCode() {
//         return getType().hashCode() + getValue().hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof FixedPGmoney) {
//             return ((FixedPGmoney)obj).getValue().equals(getValue()) && ((FixedPGmoney)obj).getType().equals(getType());
//         }
//         return false;
//     }
// }
// 
// Path: src/main/java/com/jajja/jorm/patch/postgres/FixedPGobject.java
// @SuppressWarnings("serial")
// public class FixedPGobject extends org.postgresql.util.PGobject {
//     public FixedPGobject() {
//         super();
//     }
// 
//     public FixedPGobject(org.postgresql.util.PGobject o) {
//         super();
//         setType(o.getType());
//         try {
//             setValue(o.getValue());
//         } catch (SQLException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     @Override
//     public int hashCode() {
//         return getType().hashCode() + getValue().hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof FixedPGobject) {
//             return ((FixedPGobject)obj).getValue().equals(getValue()) && ((FixedPGobject)obj).getType().equals(getType());
//         }
//         return false;
//     }
// }


import java.util.HashMap;
import org.postgresql.util.PGmoney;
import org.postgresql.util.PGobject;
import com.jajja.jorm.patch.postgres.FixedPGmoney;
import com.jajja.jorm.patch.postgres.FixedPGobject;

    public static class NoopFulpatcher extends Patcher {
        private NoopFulpatcher() {
        }

        @Override
        protected Object debork(Object v) {
            return v;
        }
    }

    private static class PGobjectFulpatcher extends Patcher {
        private PGobjectFulpatcher() throws Exception {
            PGobject a = new PGobject();
            PGobject b = new PGobject();
            a.setType("a");
            b.setType("b");
            a.setValue("test");
            b.setValue("test");
            if (a.equals(b)) {  // should not equal; type differs
                return;
            }
            b.setType("a");
            if (a.hashCode() != b.hashCode()) {
                return;
            }
        }

        @Override
        protected Object debork(Object v) {
// Path: src/main/java/com/jajja/jorm/patch/postgres/FixedPGmoney.java
// @SuppressWarnings("serial")
// public class FixedPGmoney extends org.postgresql.util.PGmoney {
//     public FixedPGmoney() {
//         super();
//     }
// 
//     public FixedPGmoney(org.postgresql.util.PGmoney o) {
//         super();
//         setType(o.getType());
//         try {
//             setValue(o.getValue());
//         } catch (SQLException e) {
//             throw new RuntimeException(e);
//         }
//         val = o.val;
//     }
// 
//     @Override
//     public int hashCode() {
//         return getType().hashCode() + getValue().hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof FixedPGmoney) {
//             return ((FixedPGmoney)obj).getValue().equals(getValue()) && ((FixedPGmoney)obj).getType().equals(getType());
//         }
//         return false;
//     }
// }
// 
// Path: src/main/java/com/jajja/jorm/patch/postgres/FixedPGobject.java
// @SuppressWarnings("serial")
// public class FixedPGobject extends org.postgresql.util.PGobject {
//     public FixedPGobject() {
//         super();
//     }
// 
//     public FixedPGobject(org.postgresql.util.PGobject o) {
//         super();
//         setType(o.getType());
//         try {
//             setValue(o.getValue());
//         } catch (SQLException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     @Override
//     public int hashCode() {
//         return getType().hashCode() + getValue().hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof FixedPGobject) {
//             return ((FixedPGobject)obj).getValue().equals(getValue()) && ((FixedPGobject)obj).getType().equals(getType());
//         }
//         return false;
//     }
// }


// Path: src/main/java/com/jajja/jorm/patch/Patcher.java
import java.util.HashMap;
import org.postgresql.util.PGmoney;
import org.postgresql.util.PGobject;
import com.jajja.jorm.patch.postgres.FixedPGmoney;
import com.jajja.jorm.patch.postgres.FixedPGobject;


    public static class NoopFulpatcher extends Patcher {
        private NoopFulpatcher() {
        }

        @Override
        protected Object debork(Object v) {
            return v;
        }
    }

    private static class PGobjectFulpatcher extends Patcher {
        private PGobjectFulpatcher() throws Exception {
            PGobject a = new PGobject();
            PGobject b = new PGobject();
            a.setType("a");
            b.setType("b");
            a.setValue("test");
            b.setValue("test");
            if (a.equals(b)) {  // should not equal; type differs
                return;
            }
            b.setType("a");
            if (a.hashCode() != b.hashCode()) {
                return;
            }
        }

        @Override
        protected Object debork(Object v) {
            return new FixedPGobject((PGobject)v);