private function printConflictTable(IO $io, array $mappings, $indentation = 0)
    {
        /** @var PathConflict[] $conflicts */
        $conflicts = array();
        $shortPrefix = str_repeat(' ', $indentation);
        $prefix = str_repeat(' ', $indentation + 4);
        $printNewline = false;

        foreach ($mappings as $mapping) {
            foreach ($mapping->getConflicts() as $conflict) {
                $conflicts[spl_object_hash($conflict)] = $conflict;
            }
        }

        foreach ($conflicts as $conflict) {
            if ($printNewline) {
                $io->writeLine('');
            }

            $io->writeLine(sprintf('%sConflicting path: %s', $shortPrefix, $conflict->getRepositoryPath()));
            $io->writeLine('');

            $table = new Table(PuliTableStyle::borderless());

            $table->setHeaderRow(array('Module', 'Puli Path', 'Real Path(s)'));

            foreach ($conflict->getMappings() as $mapping) {
                $table->addRow(array(
                    '<bad>'.$mapping->getContainingModule()->getName().'</bad>',
                    '<bad>'.$mapping->getRepositoryPath().'</bad>',
                    '<bad>'.implode(', ', $mapping->getPathReferences()).'</bad>',
                ));
            }

            $io->writeLine(sprintf('%sMapped by the following mappings:', $prefix));
            $io->writeLine('');

            $table->render($io, $indentation + 4);

            $printNewline = true;
        }
    }