bevy/crates
Zachary Harrold d0c0bad7b4
Split Component::register_component_hooks into individual methods (#17685)
# Objective

- Fixes #17411

## Solution

- Deprecated `Component::register_component_hooks`
- Added individual methods for each hook which return `None` if the hook
is unused.

## Testing

- CI

---

## Migration Guide

`Component::register_component_hooks` is now deprecated and will be
removed in a future release. When implementing `Component` manually,
also implement the respective hook methods on `Component`.

```rust
// Before
impl Component for Foo {
    // snip
    fn register_component_hooks(hooks: &mut ComponentHooks) {
            hooks.on_add(foo_on_add);
    }
}

// After
impl Component for Foo {
    // snip
    fn on_add() -> Option<ComponentHook> {
            Some(foo_on_add)
    }
}
```

## Notes

I've chosen to deprecate `Component::register_component_hooks` rather
than outright remove it to ease the migration guide. While it is in a
state of deprecation, it must be used by
`Components::register_component_internal` to ensure users who haven't
migrated to the new hook definition scheme aren't left behind. For users
of the new scheme, a default implementation of
`Component::register_component_hooks` is provided which forwards the new
individual hook implementations.

Personally, I think this is a cleaner API to work with, and would allow
the documentation for hooks to exist on the respective `Component`
methods (e.g., documentation for `OnAdd` can exist on
`Component::on_add`). Ideally, `Component::on_add` would be the hook
itself rather than a getter for the hook, but it is the only way to
early-out for a no-op hook, which is important for performance.

## Migration Guide

`Component::register_component_hooks` has been deprecated. If you are
manually implementing the `Component` trait and registering hooks there,
use the individual methods such as `on_add` instead for increased
clarity.
2025-02-05 19:33:05 +00:00
..
bevy_a11y Add no_std Support to bevy_a11y (#17505) 2025-01-23 03:52:47 +00:00
bevy_animation Cold Specialization (#17567) 2025-02-05 18:31:20 +00:00
bevy_app Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_asset Add weak_handle! convenience macro (#17384) 2025-02-05 19:30:33 +00:00
bevy_audio Relationships (non-fragmenting, one-to-many) (#17398) 2025-01-18 22:20:30 +00:00
bevy_color Fixes #17508: bevy_color::Color constructor docs get docs matching underlying constructor (#17601) 2025-01-29 18:21:23 +00:00
bevy_core_pipeline Split Component::register_component_hooks into individual methods (#17685) 2025-02-05 19:33:05 +00:00
bevy_derive
bevy_dev_tools Smarter testbeds (#17573) 2025-01-31 22:38:39 +00:00
bevy_diagnostic Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_dylib Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_ecs Split Component::register_component_hooks into individual methods (#17685) 2025-02-05 19:33:05 +00:00
bevy_encase_derive
bevy_gilrs Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_gizmos Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_gltf Fix Maya-exported rigs by not trying to topologically sort glTF nodes. (#17641) 2025-02-02 13:53:55 +00:00
bevy_image Image::get_color_at and Image::set_color_at: Support 16-bit float values (#17550) 2025-01-31 00:36:11 +00:00
bevy_input added Hash to MouseScrollUnit; (#17538) 2025-01-26 22:24:50 +00:00
bevy_input_focus Refactored ComponentHook Parameters into HookContext (#17503) 2025-01-23 02:45:24 +00:00
bevy_internal Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_log Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_macro_utils Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_math feat: impl Ease for Isometry[2/3]d (#17545) 2025-02-02 15:07:35 +00:00
bevy_mesh Implementing Reflect on *MeshBuilder types (#17600) 2025-02-03 21:53:51 +00:00
bevy_mikktspace Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_pbr Cold Specialization (#17567) 2025-02-05 18:31:20 +00:00
bevy_picking Fix a couple of doc typos (#17673) 2025-02-05 19:29:22 +00:00
bevy_platform_support Improve ergonomics of platform_support's Instant (#17577) 2025-02-02 15:50:48 +00:00
bevy_ptr Update safety docs for Ptr::assert_unique (#17394) 2025-01-16 03:25:19 +00:00
bevy_reflect Bump to uuid 1.13.1 and enable js on wasm targets (#17689) 2025-02-05 06:05:32 +00:00
bevy_remote Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_render Move Item and fetch to QueryData from WorldQuery (#17679) 2025-02-05 18:46:18 +00:00
bevy_scene Bump to uuid 1.13.1 and enable js on wasm targets (#17689) 2025-02-05 06:05:32 +00:00
bevy_sprite Cold Specialization (#17567) 2025-02-05 18:31:20 +00:00
bevy_state Fix link to states example (#17595) 2025-01-29 21:44:55 +00:00
bevy_tasks Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_text Cold Specialization (#17567) 2025-02-05 18:31:20 +00:00
bevy_time Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_transform Warnings and docs for exponential denormalization in rotate functions (alternative to #17604) (#17646) 2025-02-03 22:02:12 +00:00
bevy_ui Basic UI text shadows (#17559) 2025-02-05 19:29:37 +00:00
bevy_utils Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_window Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_winit Fix cursor hotspot out of bounds when flipping (#17571) 2025-02-02 18:22:34 +00:00