// Code generated by gobind. DO NOT EDIT.

// Java class issue12403.Parsable is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java issue12403
package issue12403;

import go.Seq;

public interface Parsable {
    public String fromJSON(String jstr);
    public String toJSON() throws Exception;
    
}

// Code generated by gobind. DO NOT EDIT.

// Java class issue12403.Issue12403 is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java issue12403
package issue12403;

import go.Seq;

public abstract class Issue12403 {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Issue12403() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    private static final class proxyParsable implements Seq.Proxy, Parsable {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyParsable(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native String fromJSON(String jstr);
        public native String toJSON() throws Exception;
    }
    
    
}
