private void generateDecoderFields(
        final StringBuilder sb,
        final FieldPrecedenceModel fieldPrecedenceModel,
        final List<Token> tokens,
        final String indent)
    {
        Generators.forEachField(
            tokens,
            (fieldToken, typeToken) ->
            {
                final String propertyName = formatPropertyName(fieldToken.name());
                final String typeName = decoderName(typeToken.name());

                generateFieldIdMethod(sb, fieldToken, indent);
                generateFieldSinceVersionMethod(sb, fieldToken, indent);
                generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent);
                generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent);
                generateFieldMetaAttributeMethod(sb, fieldToken, indent);

                generateAccessOrderListenerMethod(sb, fieldPrecedenceModel, indent + "    ", fieldToken);
                final CharSequence accessOrderListenerCall = generateAccessOrderListenerCall(
                    fieldPrecedenceModel, indent + "        ", fieldToken);

                switch (typeToken.signal())
                {
                    case ENCODING:
                        generatePrimitiveDecoder(
                            sb, false, propertyName, accessOrderListenerCall, fieldToken, typeToken, indent);
                        break;

                    case BEGIN_ENUM:
                        generateEnumDecoder(
                            sb, false, accessOrderListenerCall, fieldToken, propertyName, typeToken, indent);
                        break;

                    case BEGIN_SET:
                        generateBitSetProperty(
                            sb, false, DECODER, propertyName, accessOrderListenerCall,
                            fieldToken, typeToken, indent, typeName);
                        break;

                    case BEGIN_COMPOSITE:
                        generateCompositeProperty(
                            sb, false, DECODER, propertyName, accessOrderListenerCall,
                            fieldToken, typeToken, indent, typeName);
                        break;

                    default:
                        break;
                }
            });
    }
\n" +
                "     * Field presence indication. Can be optional, required, or constant.\n" +
                "
sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java