@NonNull
 protected MovieSearchResult parseJson(String jsonResponse)
     throws MovieService.MovieServiceException {
   try {
     JsonVisitable visitable = this.jsonVisitableProvider.use(new JSONObject(jsonResponse));
     MovieVisitor movieVisitor = new MovieVisitor();
     TotalResultVisitor totalResultVisitor = new TotalResultVisitor();
     visitable.accept(movieVisitor);
     visitable.accept(totalResultVisitor);
     return new MovieSearchResultImpl(
         totalResultVisitor.getPage(),
         totalResultVisitor.getTotalPages(),
         totalResultVisitor.getTotalResults(),
         movieVisitor.getMovies());
   } catch (JSONException e) {
     throw new MovieService.MovieServiceException(e);
   }
 }
 public void visitMovies(MovieVisitor visitor) {
   for (MovieDTO m : movieService.getAllMovies()) {
     visitor.visit(
         m.getId(), m.getTitle(), m.getReleaseDate(), m.isRented(), m.getPriceCategory());
   }
 }