def METHOD_NAME(self, array, copy_from_self=False, copy=False):
    """Merge this array with another one. The resulting array will have the
    size of the larger one, with values replaced from ``array``.
    This only works if one of the two arrays is contained in the other. In
    this case, ``array`` will overwrite values in ``self`` (unless
    ``copy_from_self`` is set to ``True``).
    A copy will only be made if necessary or ``copy`` is set to ``True``.
    """
    # It is unclear how to merge arrays in all cases. Consider a 10x10 array,
    # you crop out a 5x5 area, do a shift augment, and attempt to merge.
    # What does that mean? specs have changed. It should be a new key.
    raise NotImplementedError("Merge function should not be used!")
    self_roi = self.spec.roi
    array_roi = array.spec.roi
    assert self_roi.contains(array_roi) or array_roi.contains(
        self_roi
    ), "Can not merge arrays that are not contained in each other."
    assert (
        self.spec.voxel_size == array.spec.voxel_size
    ), "Can not merge arrays with different voxel sizes."
    # make sure self contains array
    if not self_roi.contains(array_roi):
        return array.METHOD_NAME(self, not copy_from_self, copy)
    # -> here we know that self contains array
    # simple case, self overwrites all of array
    if copy_from_self:
        return self if not copy else self.copy()
    # -> here we know that copy_from_self == False
    # simple case, ROIs are the same
    if self_roi == array_roi:
        return array if not copy else array.copy()
    # part of self have to be replaced, a copy is needed
    merged = self.copy()
    voxel_size = self.spec.voxel_size
    data_roi = (array_roi - self_roi.offset) / voxel_size
    slices = data_roi.get_bounding_box()
    while len(slices) < len(self.data.shape):
        slices = (slice(None),) + slices
    merged.data[slices] = array.data
    return merged