pub struct AppTypeRegistry(pub TypeRegistryArc);Available on crate feature
bevy_reflect only.Expand description
A Resource storing TypeRegistry for
type registrations relevant to a whole app.
Tuple Fields§
§0: TypeRegistryArcImplementations§
Source§impl AppTypeRegistry
impl AppTypeRegistry
Sourcepub fn new_with_derived_types() -> AppTypeRegistry
Available on crate feature reflect_auto_register only.
pub fn new_with_derived_types() -> AppTypeRegistry
reflect_auto_register only.Creates AppTypeRegistry and automatically registers all types deriving Reflect.
See TypeRegistry::register_derived_types for more details.
Methods from Deref<Target = TypeRegistryArc>§
Sourcepub fn read(&self) -> RwLockReadGuard<'_, TypeRegistry>
pub fn read(&self) -> RwLockReadGuard<'_, TypeRegistry>
Takes a read lock on the underlying TypeRegistry.
Examples found in repository?
examples/reflection/generic_reflection.rs (line 23)
22fn setup(type_registry: Res<AppTypeRegistry>) {
23 let type_registry = type_registry.read();
24
25 let registration = type_registry.get(TypeId::of::<MyType<u32>>()).unwrap();
26 info!(
27 "Registration for {} exists",
28 registration.type_info().type_path(),
29 );
30
31 // MyType<String> was not manually registered, so it does not exist
32 assert!(type_registry.get(TypeId::of::<MyType<String>>()).is_none());
33}More examples
examples/reflection/serialization.rs (line 36)
35fn deserialize(type_registry: Res<AppTypeRegistry>) {
36 let type_registry = type_registry.read();
37
38 // a serde_json::Value that might have come from an API
39 let value: serde_json::Value = serde_json::from_str(PLAYER_JSON).unwrap();
40
41 // alternatively, `TypedReflectDeserializer` can be used if the type
42 // is known.
43 let deserializer = ReflectDeserializer::new(&type_registry);
44 // deserialize
45 let reflect_value = deserializer.deserialize(value).unwrap();
46 // If Player implemented additional functionality, like Component,
47 // this reflect_value could be used with commands.insert_reflect
48 info!(?reflect_value);
49}
50
51fn serialize(type_registry: Res<AppTypeRegistry>) {
52 let type_registry = type_registry.read();
53
54 // a concrete value
55 let value = Player {
56 name: "BevyPlayerSerialize".to_string(),
57 health: 80,
58 };
59
60 // By default, all derived `Reflect` types can be serialized using serde. No need to derive
61 // Serialize!
62 let serializer = ReflectSerializer::new(&value, &type_registry);
63 let json = serde_json::to_string(&serializer).unwrap();
64 info!(?json);
65}examples/scene/scene.rs (line 187)
157fn save_scene_system(world: &mut World) {
158 // Scenes can be created from any ECS World.
159 // You can either create a new one for the scene or use the current World.
160 // For demonstration purposes, we'll create a new one.
161 let mut scene_world = World::new();
162
163 // The `TypeRegistry` resource contains information about all registered types (including components).
164 // This is used to construct scenes, so we'll want to ensure that our previous type registrations
165 // exist in this new scene world as well.
166 // To do this, we can simply clone the `AppTypeRegistry` resource.
167 let type_registry = world.resource::<AppTypeRegistry>().clone();
168 scene_world.insert_resource(type_registry);
169
170 let mut component_b = ComponentB::from_world(world);
171 component_b.value = "hello".to_string();
172 scene_world.spawn((
173 component_b,
174 ComponentA { x: 1.0, y: 2.0 },
175 Transform::IDENTITY,
176 Name::new("joe"),
177 ));
178 scene_world.spawn(ComponentA { x: 3.0, y: 4.0 });
179 scene_world.insert_resource(ResourceA { score: 1 });
180
181 // With our sample world ready to go, we can now create our scene using DynamicScene or DynamicSceneBuilder.
182 // For simplicity, we will create our scene using DynamicScene:
183 let scene = DynamicScene::from_world(&scene_world);
184
185 // Scenes can be serialized like this:
186 let type_registry = world.resource::<AppTypeRegistry>();
187 let type_registry = type_registry.read();
188 let serialized_scene = scene.serialize(&type_registry).unwrap();
189
190 // Showing the scene in the console
191 info!("{}", serialized_scene);
192
193 // Writing the scene to a new file. Using a task to avoid calling the filesystem APIs in a system
194 // as they are blocking.
195 //
196 // This can't work in Wasm as there is no filesystem access.
197 #[cfg(not(target_arch = "wasm32"))]
198 IoTaskPool::get()
199 .spawn(async move {
200 // Write the scene RON data to file
201 File::create(format!("assets/{NEW_SCENE_FILE_PATH}"))
202 .and_then(|mut file| file.write(serialized_scene.as_bytes()))
203 .expect("Error while writing scene to file");
204 })
205 .detach();
206}examples/reflection/reflection.rs (line 89)
54fn setup(type_registry: Res<AppTypeRegistry>) {
55 let mut value = Foo {
56 a: 1,
57 _ignored: NonReflectedValue { _a: 10 },
58 nested: Bar { b: 8 },
59 };
60
61 // You can set field values like this. The type must match exactly or this will fail.
62 *value.get_field_mut("a").unwrap() = 2usize;
63 assert_eq!(value.a, 2);
64 assert_eq!(*value.get_field::<usize>("a").unwrap(), 2);
65
66 // You can also get the `&dyn PartialReflect` value of a field like this
67 let field = value.field("a").unwrap();
68
69 // But values introspected via `PartialReflect` will not return `dyn Reflect` trait objects
70 // (even if the containing type does implement `Reflect`), so we need to convert them:
71 let fully_reflected_field = field.try_as_reflect().unwrap();
72
73 // Now, you can downcast your `Reflect` value like this:
74 assert_eq!(*fully_reflected_field.downcast_ref::<usize>().unwrap(), 2);
75
76 // For this specific case, we also support the shortcut `try_downcast_ref`:
77 assert_eq!(*field.try_downcast_ref::<usize>().unwrap(), 2);
78
79 // `DynamicStruct` also implements the `Struct` and `Reflect` traits.
80 let mut patch = DynamicStruct::default();
81 patch.insert("a", 4usize);
82
83 // You can "apply" Reflect implementations on top of other Reflect implementations.
84 // This will only set fields with the same name, and it will fail if the types don't match.
85 // You can use this to "patch" your types with new values.
86 value.apply(&patch);
87 assert_eq!(value.a, 4);
88
89 let type_registry = type_registry.read();
90 // By default, all derived `Reflect` types can be Serialized using serde. No need to derive
91 // Serialize!
92 let serializer = ReflectSerializer::new(&value, &type_registry);
93 let ron_string =
94 ron::ser::to_string_pretty(&serializer, ron::ser::PrettyConfig::default()).unwrap();
95 info!("{}\n", ron_string);
96
97 // Dynamic properties can be deserialized
98 let reflect_deserializer = ReflectDeserializer::new(&type_registry);
99 let mut deserializer = ron::de::Deserializer::from_str(&ron_string).unwrap();
100 let reflect_value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
101
102 // Deserializing returns a `Box<dyn PartialReflect>` value.
103 // Generally, deserializing a value will return the "dynamic" variant of a type.
104 // For example, deserializing a struct will return the DynamicStruct type.
105 // "Opaque types" will be deserialized as themselves.
106 assert_eq!(
107 reflect_value.reflect_type_path(),
108 DynamicStruct::type_path(),
109 );
110
111 // Reflect has its own `partial_eq` implementation, named `reflect_partial_eq`. This behaves
112 // like normal `partial_eq`, but it treats "dynamic" and "non-dynamic" types the same. The
113 // `Foo` struct and deserialized `DynamicStruct` are considered equal for this reason:
114 assert!(reflect_value.reflect_partial_eq(&value).unwrap());
115
116 // By "patching" `Foo` with the deserialized DynamicStruct, we can "Deserialize" Foo.
117 // This means we can serialize and deserialize with a single `Reflect` derive!
118 value.apply(&*reflect_value);
119}Sourcepub fn write(&self) -> RwLockWriteGuard<'_, TypeRegistry>
pub fn write(&self) -> RwLockWriteGuard<'_, TypeRegistry>
Takes a write lock on the underlying TypeRegistry.
Trait Implementations§
Source§impl Clone for AppTypeRegistry
impl Clone for AppTypeRegistry
Source§fn clone(&self) -> AppTypeRegistry
fn clone(&self) -> AppTypeRegistry
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Default for AppTypeRegistry
impl Default for AppTypeRegistry
Source§fn default() -> AppTypeRegistry
fn default() -> AppTypeRegistry
Returns the “default value” for a type. Read more
Source§impl Deref for AppTypeRegistry
impl Deref for AppTypeRegistry
Source§type Target = TypeRegistryArc
type Target = TypeRegistryArc
The resulting type after dereferencing.
Source§impl DerefMut for AppTypeRegistry
impl DerefMut for AppTypeRegistry
impl Resource for AppTypeRegistry
Auto Trait Implementations§
impl Freeze for AppTypeRegistry
impl RefUnwindSafe for AppTypeRegistry
impl Send for AppTypeRegistry
impl Sync for AppTypeRegistry
impl Unpin for AppTypeRegistry
impl UnwindSafe for AppTypeRegistry
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
Return the
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Converts
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Converts
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Converts
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Converts
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Create an instance of this type from an initialization function
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Converts this type into the system output type.
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian().Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Convert from a type to another type.
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Convert from a type to another type.
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T, U> ToSample<U> for Twhere
U: FromSample<T>,
impl<T, U> ToSample<U> for Twhere
U: FromSample<T>,
fn to_sample_(self) -> U
Source§impl<T> TypeData for T
impl<T> TypeData for T
Source§fn clone_type_data(&self) -> Box<dyn TypeData>
fn clone_type_data(&self) -> Box<dyn TypeData>
Creates a type-erased clone of this value.