class AbstractMongoDao extends AbstractDao<M,P,K,I> {

    protected Results<M, Integer> findWithSkipLimitPagination(FindIterable<Document> iterable, int skip, int limit) {
        ImmutableList.Builder<M> builder = ImmutableList.builder();
        M mostRecentObject = null;

        // query for one more object than we actually need, in order to determine whether there is a "next" page
        int foundCount = 0;
        for (Document doc : iterable.skip(skip).limit(limit+1)) {
            if (mostRecentObject != null) {
                builder.add(mostRecentObject);
            }
            mostRecentObject = modelMapper.toObject(doc);
            foundCount++;
        }

        if (foundCount <= 0) {
            return Results.of(builder.build());
        } else if (foundCount <= limit) {
            builder.add(mostRecentObject);
            return Results.of(builder.build());
        } else {
            return Results.of(builder.build(), skip+limit);
        }
    }

    public  AbstractMongoDao(Class<M> modelClass, Class<P> partialClass, MongoCollection<Document> collection);
    public  AbstractMongoDao(Class<M> modelClass, Class<P> partialClass, MongoCollection<Document> collection, ObjectMapper objectMapper, ObjectMapper extendedJsonMapper);
    public  AbstractMongoDao(Class<M> modelClass, Class<P> partialClass, MongoCollection<Document> collection,
                            DocumentMapper<M> modelMapper, DocumentMapper<P> partialMapper);

}