def METHOD_NAME(self, slot, subindex, roi, result):
    """
    Overridden from OpUnblockedArrayCache
    """
    def copy_block(full_block_roi, clipped_block_roi):
        full_block_roi = numpy.asarray(full_block_roi)
        clipped_block_roi = numpy.asarray(clipped_block_roi)
        output_roi = numpy.asarray(clipped_block_roi) - roi.start
        block_roi = self._get_containing_block_roi(clipped_block_roi)
        # Skip cache and copy full block directly
        if self.BypassModeEnabled.value:
            full_block_data = self.Output.stype.allocateDestination(SubRegion(self.Output, *full_block_roi))
            self.Input(*full_block_roi).writeInto(full_block_data).block()
            roi_within_block = clipped_block_roi - full_block_roi[0]
            self.Output.stype.copy_data(
                result[roiToSlice(*output_roi)], full_block_data[roiToSlice(*roi_within_block)]
            )
        # If data data exists already or we can just fetch it without needing extra scratch space,
        # just call the base class
        elif block_roi is not None or (full_block_roi == clipped_block_roi).all():
            self._execute_Output_impl(clipped_block_roi, result[roiToSlice(*output_roi)])
        elif self.Input.meta.dontcache:
            # Data isn't in the cache, but we don't need it in the cache anyway.
            self.Input(*clipped_block_roi).writeInto(result[roiToSlice(*output_roi)]).block()
        else:
            # Data doesn't exist yet in the cache.
            # Request the full block, but then discard the parts we don't need.
            # (We use allocateDestination() here to support MaskedArray types.)
            # TODO: We should probably just get rid of MaskedArray support altogether...
            full_block_data = self.Output.stype.allocateDestination(SubRegion(self.Output, *full_block_roi))
            self._execute_Output_impl(full_block_roi, full_block_data)
            roi_within_block = clipped_block_roi - full_block_roi[0]
            self.Output.stype.copy_data(
                result[roiToSlice(*output_roi)], full_block_data[roiToSlice(*roi_within_block)]
            )
    clipped_block_rois = getIntersectingRois(self.Input.meta.shape, self._blockshape, (roi.start, roi.stop), True)
    full_block_rois = getIntersectingRois(self.Input.meta.shape, self._blockshape, (roi.start, roi.stop), False)
    pool = RequestPool()
    for full_block_roi, clipped_block_roi in zip(full_block_rois, clipped_block_rois):
        req = Request(partial(copy_block, full_block_roi, clipped_block_roi))
        pool.add(req)
    pool.wait()