@SuppressWarnings({ "unchecked", "rawtypes" })
    private <T> T parseResolvers(Parsable parsable, ClassAccessor<T> clazz, TokenStream stream) {
        TokenStream backup = stream.clone();
        Exception lastException = null;
        for (Class<?> resolver : parsable.resolvers()) {
            ClassAccessor<?> resolverAccessor = new ClassAccessor(resolver);
            if (!resolverAccessor.subclassOf(clazz))
                throw new ParseException("Resolver " + resolverAccessor.getName() + " does not extend base class "
                        + clazz.getName());
            try {
                T result = parseClass((ClassAccessor<? extends T>) resolverAccessor, stream);
                debug("Abstract class " + clazz.getName() + " resolved to " + resolverAccessor.getName());
                return result;
            } catch (ParseException e) {
                lastException = e;
                debug(e);
                debug("Restoring stream from \"" + backup.getBuffer() + "\"");
                stream.restoreFrom(backup);
            }
        }
        throw new ParseException("No appropriate resolvers for " + clazz.getName(), lastException);
    }