    # File lib/facets/more/downloader.rb, line 177
      def download( url, filepath, checksum='', est_size=nil )

        checksum = checksum.to_s.strip
        est_size = nil if est_size == 0

        download_complete = nil

        if interface
          interface.preparing_to_download( File.basename( filepath ), url, est_size )
        end

        progress_total = est_size ? est_size : 100000000  # pretend 100MB if no size
        pbar = Console::ProgressBar.new( "Status", progress_total, STDOUT )
        pbar.bar_mark = "="
        pbar.format = "%-6s %3d%% %s %s"
        pbar.file_transfer_mode if est_size

        progress_proc = proc { |posit| pbar.set(posit) }

        STDOUT.sync = true
        begin
          local_file = File.open( filepath, 'w' )
          remote_file = open( url, :progress_proc => progress_proc )
          local_file << remote_file.read
        rescue
          pbar.halt
          download_complete = nil
          raise
        else
          pbar.finish
          download_complete = filepath
        ensure
          remote_file.close unless remote_file.nil?
          local_file.close unless local_file.nil?
          STDOUT.sync = false
        end

        unless checksum.empty?
          raise ChecksumError if compute_checksum(filepath) != checksum
        end

        if interface
          if checksum.empty?
            interface.lacks_checksum( compute_checksum(filepath), :md5 )
          end
          unless est_size
            interface.lacks_size( File.size(filepath) )
          end
        end

        if download_complete
          if interface
            interface.downloaded( filepath )
          end
        end

        return download_complete
      end