#![allow(late_bound_lifetime_arguments)] use std::marker::PhantomData; use auto_delegate_impl::{delegate, Delegate}; #[delegate] trait Increment { fn increment(&mut self) -> usize; } #[delegate] trait Add { fn add(&self, lhs: usize, rhs: usize) -> usize; } #[delegate] trait Trait { fn sample(&self); } #[derive(Default)] struct Child(usize); impl Increment for Child { fn increment(&mut self) -> usize { self.0 += 1; self.0 } } impl Add for Child { fn add(&self, lhs: usize, rhs: usize) -> usize { lhs + rhs } } #[derive(Delegate, Default)] struct Parent(#[to(Increment)]Child, PhantomData, #[to(Add)] Child); fn main() { let mut p = Parent::default(); assert_eq!(p.increment(), 1); assert_eq!(p.increment(), 2); assert_eq!(p.increment(), 3); assert_eq!(p.add(1, 2), 3); }