def METHOD_NAME(self, offset: int, length: int, pad: bool = False) -> bytes:
    """Reads an offset for length bytes and returns 'bytes' (not 'str') of
    length size."""
    current_offset = offset
    output: List[bytes] = []
    for offset, _, mapped_offset, mapped_length, layer in self.mapping(
        offset, length, ignore_errors=pad
    ):
        if not pad and offset > current_offset:
            raise exceptions.InvalidAddressException(
                self.name,
                current_offset,
                f"Layer {self.name} cannot map offset: {current_offset}",
            )
        elif offset > current_offset:
            output += [b"\x00" * (offset - current_offset)]
            current_offset = offset
        elif offset < current_offset:
            raise exceptions.LayerException(
                self.name, "Mapping returned an overlapping element"
            )
        if mapped_length > 0:
            output += [
                self._context.layers.METHOD_NAME(layer, mapped_offset, mapped_length, pad)
            ]
        current_offset += mapped_length
    recovered_data = b"".join(output)
    return recovered_data + b"\x00" * (length - len(recovered_data))