/**
  * {@inheritdoc}
  */
 public function createView(ChoiceListInterface $list, $preferredChoices = null, $label = null, $index = null, $groupBy = null, $attr = null)
 {
     // Backwards compatibility
     if ($list instanceof LegacyChoiceListAdapter && empty($preferredChoices) && null === $label && null === $index && null === $groupBy && null === $attr) {
         $mapToNonLegacyChoiceView = function (LegacyChoiceView &$choiceView) {
             $choiceView = new ChoiceView($choiceView->data, $choiceView->value, $choiceView->label);
         };
         $adaptedList = $list->getAdaptedList();
         $remainingViews = $adaptedList->getRemainingViews();
         $preferredViews = $adaptedList->getPreferredViews();
         array_walk_recursive($remainingViews, $mapToNonLegacyChoiceView);
         array_walk_recursive($preferredViews, $mapToNonLegacyChoiceView);
         return new ChoiceListView($remainingViews, $preferredViews);
     }
     $preferredViews = array();
     $otherViews = array();
     $choices = $list->getChoices();
     $keys = $list->getOriginalKeys();
     if (!is_callable($preferredChoices) && !empty($preferredChoices)) {
         $preferredChoices = function ($choice) use($preferredChoices) {
             return false !== array_search($choice, $preferredChoices, true);
         };
     }
     // The names are generated from an incrementing integer by default
     if (null === $index) {
         $index = 0;
     }
     // If $groupBy is a callable, choices are added to the group with the
     // name returned by the callable. If the callable returns null, the
     // choice is not added to any group
     if (is_callable($groupBy)) {
         foreach ($choices as $value => $choice) {
             self::addChoiceViewGroupedBy($groupBy, $choice, (string) $value, $label, $keys, $index, $attr, $preferredChoices, $preferredViews, $otherViews);
         }
     } else {
         // Otherwise use the original structure of the choices
         self::addChoiceViewsGroupedBy($list->getStructuredValues(), $label, $choices, $keys, $index, $attr, $preferredChoices, $preferredViews, $otherViews);
     }
     // Remove any empty group view that may have been created by
     // addChoiceViewGroupedBy()
     foreach ($preferredViews as $key => $view) {
         if ($view instanceof ChoiceGroupView && 0 === count($view->choices)) {
             unset($preferredViews[$key]);
         }
     }
     foreach ($otherViews as $key => $view) {
         if ($view instanceof ChoiceGroupView && 0 === count($view->choices)) {
             unset($otherViews[$key]);
         }
     }
     return new ChoiceListView($otherViews, $preferredViews);
 }