rust-oop 0.1.2

use macro to implement inheritance
Documentation

use std::pin::Pin;

#[test]
fn main_test() {
    let mut test = Test2::new("A".to_string());
    unsafe {Pin::get_unchecked_mut(test.as_mut())}.set_data("B".to_string());
}

struct Test{
    data: String,
    _pinned: std::marker::PhantomPinned,
}

trait RealTest {
    fn with() -> Pin<Box<Self>> where Self : Sized;
    fn set_data(&mut self, data: String);
}

impl Test {
    fn new(data: String) -> Pin<Box<Self>> {
        Box::pin(Self {data: data, _pinned: std::marker::PhantomPinned,})
    }
}

impl RealTest for Test {
    fn with() -> Pin<Box<Self>> where Self : Sized {
        Self::new(String::from("default value"))
    }

    fn set_data(&mut self, data: String) {
        self.data = data;
    }
}

struct Test2 {
    prototype: Pin<Box<Test>>,
    _pinned: std::marker::PhantomPinned,
}

impl RealTest for Test2 {
    fn with() -> Pin<Box<Self>> where Self : Sized {
        Self::new(String::from("default value"))
    }
    fn set_data(&mut self, data: String) {
        unsafe {Pin::get_unchecked_mut( self.prototype.as_mut())}.set_data(data);
    }
}

impl Test2 {
    fn new(data: String) -> Pin<Box<Self>> {
        let prototype = Test::new(data);
        Box::pin(Self {prototype, _pinned: std::marker::PhantomPinned})
    }
}