You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: analyzer.rb
    path of file: ./repos/index_shotgun/lib/index_shotgun
    
    the code of the file until where you have to start completion: module IndexShotgun
  module Analyzer # rubocop:disable Metrics/ModuleLength
    require "index_shotgun/array_start_with"

    class Response
      attr_accessor :message, :duplicate_index_count, :total_index_count, :total_table_count

      def successful?
        duplicate_index_count == 0
      end

      def exit_if_failure!
        exit(1) unless successful?
      end
    end

    class << self
      using IndexShotgun::ArrayStartWith

      # Search duplicate index
      # @return [IndexShotgun::Analyzer::Response]
      def perform
        tables =
          silence_deprecations do
            ActiveRecord::Base.connection.tables
          end
        tables.reject! {|table| exclude_tables.include?(table.downcase) }

        duplicate_indexes =
          tables.each_with_object([]) do |table, array|
            response = check_indexes(table)
            array.push(*response)
          end

        message =
          duplicate_indexes.each_with_object("") do |info, str|
            str << <<~MSG
              # =============================
              # #{info[:index].table}
              # =============================

              # #{info[:result]}
              # To remove this duplicate index, execute:
              ALTER TABLE `#{info[:index].table}` DROP INDEX `#{info[:index].name}`;

 
    
      def perform
        tables =
          silence_deprecations do
            ActiveRecord::Base.connection.tables
          end
        tables.reject! {|table| exclude_tables.include?(table.downcase) }

        duplicate_indexes =
          tables.each_with_object([]) do |table, array|
            response = check_indexes(table)
            array.push(*response)
          end

        message =
          duplicate_indexes.each_with_object("") do |info, str|
            str << <<~MSG
              # =============================
              # #{info[:index].table}
              # =============================

              # #{info[:result]}
              # To remove this duplicate index, execute:
              ALTER TABLE `#{info[:index].table}` DROP INDEX `#{info[:index].name}`;

            MSG
          end

        total_index_count = tables.map {|table| table_indexes(table).count }.sum
        message << <<~MSG
          # ########################################################################
          # Summary of indexes
          # ########################################################################

          # Total Duplicate Indexes  #{duplicate_indexes.count}
          # Total Indexes            #{total_index_count}
          # Total Tables             #{tables.count}

        MSG

        response = Response.new
        response.duplicate_index_count = duplicate_indexes.count
        response.message               = message
        response.total_index_count     = total_index_count
        response.total_table_count     = tables.count

        response
      end