async def METHOD_NAME(self, changed: dict[str, Any] | None = None) -> None:
    """Update properties via D-Bus.
    Also rebuilds cache of available block devices and drives.
    """
    await super().METHOD_NAME(changed)
    if not changed:
        # Cache block devices
        block_devices = await self.dbus.Manager.call_get_block_devices(
            UDISKS2_DEFAULT_OPTIONS
        )
        unchanged_blocks = self._block_devices.keys() & set(block_devices)
        for removed in self._block_devices.keys() - set(block_devices):
            self._block_devices[removed].shutdown()
        self._block_devices = {
            device: self._block_devices[device]
            if device in unchanged_blocks
            else await UDisks2Block.new(device, self.dbus.bus)
            for device in block_devices
        }
        # For existing block devices, need to check their type and call update
        await asyncio.gather(
            *[self._block_devices[path].check_type() for path in unchanged_blocks]
        )
        await asyncio.gather(
            *[self._block_devices[path].METHOD_NAME() for path in unchanged_blocks]
        )
        # Cache drives
        drives = {
            device.drive
            for device in self.block_devices
            if device.drive != DBUS_OBJECT_BASE
        }
        unchanged_drives = self._drives.keys() & set(drives)
        for removed in self._drives.keys() - drives:
            self._drives[removed].shutdown()
        self._drives = {
            drive: self._drives[drive]
            if drive in self._drives
            else await UDisks2Drive.new(drive, self.dbus.bus)
            for drive in drives
        }
        # Update existing drives
        await asyncio.gather(
            *[self._drives[path].METHOD_NAME() for path in unchanged_drives]
        )