// Java class go.issue12328.Issue12328 is a proxy for talking to a Go program.
//   gobind -lang=java issue12328
//
// File is generated by gobind. Do not edit.
package go.issue12328;

import go.Seq;

public abstract class Issue12328 {
    private Issue12328() {} // uninstantiable
    
    public static final class T implements go.Seq.Object {
        private static final String DESCRIPTOR = "go.issue12328.T";
        private static final int FIELD_Err_GET = 0x00f;
        private static final int FIELD_Err_SET = 0x01f;
        
        private go.Seq.Ref ref;
        
        private T(go.Seq.Ref ref) { this.ref = ref; }
        
        public go.Seq.Ref ref() { return ref; }
        
        public void call(int code, go.Seq in, go.Seq out) {
            throw new RuntimeException("internal error: cycle: cannot call concrete proxy");
        }
        
        public String getErr() {
            Seq in = new Seq();
            Seq out = new Seq();
            in.writeRef(ref);
            Seq.send(DESCRIPTOR, FIELD_Err_GET, in, out);
            return out.readString();
        }
        
        public void setErr(String v) {
            Seq in = new Seq();
            Seq out = new Seq();
            in.writeRef(ref);
            in.writeString(v);
            Seq.send(DESCRIPTOR, FIELD_Err_SET, in, out);
        }
        
        @Override public boolean equals(Object o) {
            if (o == null || !(o instanceof T)) {
                return false;
            }
            T that = (T)o;
            String thisErr = getErr();
            String thatErr = that.getErr();
            if (thisErr == null) {
                if (thatErr != null) {
                    return false;
                }
            } else if (!thisErr.equals(thatErr)) {
                return false;
            }
            return true;
        }
        
        @Override public int hashCode() {
            return java.util.Arrays.hashCode(new Object[] {getErr()});
        }
        
        @Override public String toString() {
            StringBuilder b = new StringBuilder();
            b.append("T").append("{");
            b.append("Err:").append(getErr()).append(",");
            return b.append("}").toString();
        }
        
    }
    
    private static final String DESCRIPTOR = "issue12328";
}
