---
title: "`SystemBuffer` requires `queue()` to be implemented"
pull_requests: [22832]
---

`SystemBuffer` now requires `queue()` to be implemented, instead of `apply().`
`apply()`'s default implementation now delegates to `queue()`.

This is to ensure that a `SystemBuffer` used in an observer context applies its changes.
In most cases, if `apply()` does not change the `World` structurally,
`apply()` and `queue()` can mutate the `World` directly in the same way.

If `apply()` does not change the `World` structurally, `apply()` should be changed to `queue()`:

```rust
// 0.18
impl SystemBuffer for MySystemBuffer {
  fn apply(&mut self, system_meta: &SystemMeta, world: &mut World) {
    // your impl here
  }
}

// 0.19
impl SystemBuffer for MySystemBuffer {
  fn queue(&mut self, system_meta: &SystemMeta, mut world: DeferredWorld) {
    // your impl here, using a DeferredWorld instead
  }
}
```

If `apply()` does change the `World` structurally, implement both `apply()` and `queue()`.
To queue structural changes to a `DeferredWorld`, add the structural changes to its command queue,
accessible via `world.commands()`.
