code: def install(self, source, dest=None, checksum=None, hash_type='sha1'):
          
          url_parts = self.parse_url(source)
          dest_dir = os.path.join(os.environ.get('CHARM_DIR'), 'fetched')
          if not os.path.exists(dest_dir):
              mkdir(dest_dir, perms=0o755)
          dld_file = os.path.join(dest_dir, os.path.basename(url_parts.path))
          try:
              self.download(source, dld_file)
          except URLError as e:
              raise UnhandledSource(e.reason)
          except OSError as e:
              raise UnhandledSource(e.strerror)
          options = parse_qs(url_parts.fragment)
          for key, value in options.items():
              if not six.PY3:
                  algorithms = hashlib.algorithms
              else:
                  algorithms = hashlib.algorithms_available
              if key in algorithms:
                  if len(value) != 1:
                      raise TypeError(
                          "Expected 1 hash value, not %d" % len(value))
                  expected = value[0]
                  check_hash(dld_file, expected, key)
          if checksum:
              check_hash(dld_file, checksum, hash_type)
          return extract(dld_file, dest)
docs: Download and install an archive file, with optional checksum validation.
  
          The checksum can also be given on the `source` URL's fragment.
          For example::
  
              handler.install('http://example.com/file.tgz#sha1=deadbeef')
  
          :param str source: URL pointing to an archive file.
          :param str dest: Local destination path to install to. If not given,
              installs to `$CHARM_DIR/archives/archive_file_name`.
          :param str checksum: If given, validate the archive file after download.
          :param str hash_type: Algorithm used to generate `checksum`.
              Can be any hash alrgorithm supported by :mod:`hashlib`,
              such as md5, sha1, sha256, sha512, etc.