//:: import os
//:: for prop in msg.interface.members:
//:: getter_template_file_name = "%s/custom/%s_%s.java" % (template_dir, msg.name if not builder else msg.name + '.Builder', prop.getter_name)
//:: if os.path.exists(getter_template_file_name):
//:: include(getter_template_file_name, msg=msg, builder=builder, has_parent=has_parent)

//:: else:
    @Override
    public ${prop.java_type.public_type} ${prop.getter_name}()${ "" if prop in msg.members else "throws UnsupportedOperationException"} {
//:: if prop in msg.members:
//::    version_prop = msg.get_member(prop.name)
//::    if version_prop.is_fixed_value:
        return ${version_prop.enum_value};
//::    elif version_prop.is_length_value:
        // FIXME: Hacky and inperformant way to determine a message length. Should be replaced with something better
        ChannelBuffer c = new LengthCountingPseudoChannelBuffer();
        WRITER.write(c, ${ "this" if not builder else "({0}) this.getMessage()".format(msg.name) });
        return c.writerIndex();
//::    else:
        return ${version_prop.name};
//::    #endif
//:: else:
        throw new UnsupportedOperationException("Property ${prop.name} not supported in version #{version}");
//:: #endif
    }
//:: #endif

//:: if generate_setters and prop.is_writeable:
    //:: setter_template_file_name = "%s/custom/%s_%s.java" % (template_dir, msg.name if not builder else msg.name + '.Builder', prop.setter_name)
    //:: if os.path.exists(setter_template_file_name):
    //:: include(setter_template_file_name, msg=msg, builder=builder, has_parent=has_parent)

    //:: else:
    @Override
    public ${msg.interface.name}.Builder ${prop.setter_name}(${prop.java_type.public_type} ${prop.name})${ "" if prop in msg.members else " throws UnsupportedOperationException"} {
        //:: if prop in msg.members:
        this.${prop.name} = ${prop.name};
        this.${prop.name}Set = true;
        return this;
        //:: else:
            throw new UnsupportedOperationException("Property ${prop.name} not supported in version #{version}");
        //:: #endif
    }
    //:: #endif
    //:: #endif
//:: #endfor
