# File lib/rqrcode/qrcode/qr_code.rb, line 185
    def initialize( string, *args )
      if !string.is_a? String
        raise QRCodeArgumentError, "The passed data is #{string.class}, not String"
      end

      options               = args.extract_options!
      level                 = (options[:level] || :h).to_sym

      if !QRERRORCORRECTLEVEL.has_key?(level)
        raise QRCodeArgumentError, "Unknown error correction level `#{level.inspect}`"
      end

      @data                 = string

      mode                  = QRMODE_NAME[(options[:mode] || '').to_sym]
      # If mode is not explicitely given choose mode according to data type
      mode ||= case
        when RQRCode::QRNumeric.valid_data?(@data)
          QRMODE_NAME[:number]
        when QRAlphanumeric.valid_data?(@data)
          QRMODE_NAME[:alphanumeric]
        else
          QRMODE_NAME[:byte_8bit]
      end

      max_size_array        = QRMAXDIGITS[level][mode]
      size                  = options[:size] || smallest_size_for(string, max_size_array)

      if size > QRUtil.max_size
        raise QRCodeArgumentError, "Given size greater than maximum possible size of #{QRUtil.max_size}"
      end

      @error_correct_level  = QRERRORCORRECTLEVEL[level]
      @version              = size
      @module_count         = @version * 4 + QRPOSITIONPATTERNLENGTH
      @modules              = Array.new( @module_count )
      @data_list            =
        case mode
        when :mode_number
          QRNumeric.new( @data )
        when :mode_alpha_numk
          QRAlphanumeric.new( @data )
        else
          QR8bitByte.new( @data )
        end

      @data_cache           = nil
      self.make
    end