def METHOD_NAME(self) -> None:
    """
    _load_ebpf_programs reads eBPF templates from _ebpf_programs, renders
    them with context, compiles and loads them into kernel, and registers
    corresponding front-end handlers
    Raises:
        NoSourcesFoundError: self._ebpf_programs was empty or no source in
        self._ebpf_programs could be loaded
    """
    if not self._ebpf_programs:
        raise NoSourcesFoundError()
    sources = []
    for basename in self._ebpf_programs:
        filename = os.path.join(EBPF_SRC_DIR, f'{basename}.bpf.c')
        try:
            sources.append(_get_ebpf_source(filename, self._context))
            handler = ebpf_handlers[basename](self._service_registry)
            self._handlers.append(handler)
        except FileNotFoundError:
            logging.error('Could not open eBPF source file %s', filename)
        except KeyError:
            logging.error('Fatal: did not find handler for %s', basename)
    # found eBPF sources to load into kernel
    if sources:
        # find and prepend header
        header = os.path.join(EBPF_SRC_DIR, EBPF_COMMON_FILE)
        try:
            sources.insert(0, _get_ebpf_source(header, self._context))
            self._bpf = BPF(text='\n'.join(sources))
            logging.info('Loaded sources into kernel')
        except FileNotFoundError:
            logging.error('Fatal: Could not open header file %s', header)
    else:
        raise NoSourcesFoundError()