@Override
    public void sectionBegin(String secName, boolean inverted)
        throws MustacheParserException
    {
        final ValueReference valueReference = findValue(secName);
        final ValueSource valueSource = valueReference.valueSource;

        // gather information we need to decide what to instantiate
        final Class<?> valueType = valueSource.getType();
        final PrimitiveType pt = PrimitiveType.getSwitchType(valueType);

        // begin constructing what we need for the section
        final LinkedList<FragmentRenderer> fragmentList = new LinkedList<FragmentRenderer>();

        if (pt == PrimitiveType.BOOLEAN)
        {
            final ObjectHandler objectHandler =
                    new ObjectHandler(fragmentList, inverted, valueReference,
                            valueSource.getConditionalRendererClass(), stackingParserHandler,
                            mustacheServices, forClass);

            stackingParserHandler.push(objectHandler);
            return;
        }

        if (pt == PrimitiveType.STRING)
        {
            final ObjectHandler objectHandler =
                    new ObjectHandler(fragmentList, inverted, valueReference,
                            valueSource.getStringSectionRendererClass(), stackingParserHandler,
                            mustacheServices, forClass);

            stackingParserHandler.push(objectHandler);
            return;
        }

        if (pt == PrimitiveType.OBJECT)
        {
            // check for Iterable<T>
            if (Iterable.class.isAssignableFrom(valueType))
            {
                setupIteration(secName, Iterable.class, valueReference, valueSource.getIterableRendererClass(),
                        fragmentList, inverted);
                return;
            }

            if (Iterator.class.isAssignableFrom(valueType))
            {
                final Class<? extends FragmentRenderer> rendererClass = valueSource.getIteratorRendererClass();
                if (rendererClass == null)
                    throw new MustacheParserException(locator, "section \"" + secName +
                            "\": using an Iterator<>-valued field is not allowed");

                setupIteration(secName, Iterable.class, valueReference, rendererClass, fragmentList, inverted);
                return;
            }

            // check for arrays
            // TODO

            // reject other generics for the time being
            // TODO detect these

            final ObjectHandler objectHandler =
                    new ObjectHandler(fragmentList, inverted, valueReference,
                            valueSource.getObjectRendererClass(), stackingParserHandler, mustacheServices,
                            (inverted ? forClass : valueType));
            stackingParserHandler.push(objectHandler);
            return;
        }

        throw new MustacheParserException(locator, "section '" + secName +
                "': don't know what to do with MustacheValue '" + valueSource.getName() +
                "' of type '" + valueType.getName() + "'");
    }