multi-any 0.1.1

`MultiAny` is just like `Any` but can downcast to trait objects.
Documentation
//! Provides [`MultiAny`], a trait for dynamic typing that allows downcasting to
//! concrete types and trait objects.
//!
//! [Cargo features](`features`).

#![cfg_attr(feature = "nightly", feature(ptr_metadata))]

mod meta;
mod multi_any;
mod ptr_metadata;
mod typed_metadata;

pub use meta::*;
pub use multi_any::*;
pub use ptr_metadata::multi_any;
pub use typed_metadata::*;

/// Derive macro for `MultiAny`.
///
/// See [`MultiAny`] for usage and examples.
pub use multi_any_macro::MultiAny;

/// # Cargo features
///
/// - `stable` (default): Uses the `ptr_meta` crate for pointer metadata operations.
/// - `nightly`: Uses nightly Rust's built-in `ptr_metadata` feature.
///
/// ## Usage
///
/// On stable Rust (default), annotate traits with `#[multi_any]`:
/// ```
///    use multi_any::*;
///
///    #[multi_any]
///    trait SomeTrait {}
///
///    #[derive(MultiAny)]
///    #[multi_any(SomeTrait)]
///    struct Foo;
///    impl SomeTrait for Foo {}
///
///    let foo: Box<dyn MultiAny> = Box::new(Foo);
///    assert!(foo.downcast_ref::<dyn SomeTrait>().is_some())
/// ```
///
/// On nightly Rust with the "nightly" feature enabled, it is possible to omit `#[multi_any]`
/// ```
/// #[cfg(feature="nightly")]
/// {
///     use multi_any::*;
///
///     // no annotation here
///     trait SomeTrait {}
///      
///     #[derive(MultiAny)]
///     #[multi_any(SomeTrait)]
///     struct Foo;
///     impl SomeTrait for Foo {}
///
///     let foo: Box<dyn MultiAny> = Box::new(Foo);
///     assert!(foo.downcast_ref::<dyn SomeTrait>().is_some())
/// }
/// ```
pub mod features {}