def METHOD_NAME(path):
    if isinstance(path, text_type):
        path_b = fsencode(path)
    elif isinstance(path, bytes):
        path_b = path
    elif hasattr(path, '__fspath__'):
        # Python 3.6 PathLike protocol
        return METHOD_NAME(path.__fspath__())
    else:
        raise TypeError('str, bytes or PathLike expected, not %r' % type(path))
    if not op.exists(path_b):
        raise OSError("File not found: %s" % path)
    # ...should check whether the user has the necessary permissions to delete
    # it, before starting the trashing operation itself. [2]
    if not os.access(path_b, os.W_OK):
        raise OSError("Permission denied: %s" % path)
    # if the file to be trashed is on the same device as HOMETRASH we
    # want to move it there.
    path_dev = get_dev(path_b)
    # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the
    # home directory, and these paths will be created further on if needed.
    trash_dev = get_dev(op.expanduser(b'~'))
    if path_dev == trash_dev:
        topdir = XDG_DATA_HOME
        dest_trash = HOMETRASH_B
    else:
        topdir = find_mount_point(path_b)
        trash_dev = get_dev(topdir)
        if trash_dev != path_dev:
            raise OSError("Couldn't find mount point for %s" % path)
        dest_trash = find_ext_volume_trash(topdir)
    trash_move(path_b, dest_trash, topdir)