code: def _get_module_via_pkgutil(self, fullname):
          
          try:
              # Pre-'import spec' this returned None, in Python3.6 it raises
              # ImportError.
              loader = pkgutil.find_loader(fullname)
          except ImportError:
              e = sys.exc_info()[1]
              LOG.debug('%r._get_module_via_pkgutil(%r): %s',
                        self, fullname, e)
              return None
  
          IOLOG.debug('%r._get_module_via_pkgutil(%r) -> %r',
                      self, fullname, loader)
          if not loader:
              return
  
          try:
              path = self._py_filename(loader.get_filename(fullname))
              source = loader.get_source(fullname)
              is_pkg = loader.is_package(fullname)
          except (AttributeError, ImportError):
              # - Per PEP-302, get_source() and is_package() are optional,
              #   calling them may throw AttributeError.
              # - get_filename() may throw ImportError if pkgutil.find_loader()
              #   picks a "parent" package's loader for some crap that's been
              #   stuffed in sys.modules, for example in the case of urllib3:
              #       "loader for urllib3.contrib.pyopenssl cannot handle
              #        requests.packages.urllib3.contrib.pyopenssl"
              e = sys.exc_info()[1]
              LOG.debug('%r: loading %r using %r failed: %s',
                        self, fullname, loader, e)
              return
  
          if path is None or source is None:
              return
  
          if isinstance(source, mitogen.core.UnicodeType):
              # get_source() returns "string" according to PEP-302, which was
              # reinterpreted for Python 3 to mean a Unicode string.
              source = source.encode('utf-8')
  
          return path, source, is_pkg
docs: Attempt to fetch source code via pkgutil. In an ideal world, this would
          be the only required implementation of get_module().