use std::boxed::Box;
use std::any::Any;
use crate::event::EventContext;
use crate::event::EventResult;
pub type ObjectRef = u32;
pub trait LowObject<TState, TComponentManager>
{
fn on_event(&mut self, event: Box<dyn Any>, context: EventContext<TState, TComponentManager>) -> Option<EventResult>;
fn on_init(&mut self, ptr: ObjectRef, components: &mut TComponentManager);
fn on_remove(&mut self, ptr: ObjectRef, components: &mut TComponentManager);
}
pub trait Object<TState, TComponentManager>
{
type EventType: Any;
fn event(&mut self, event: &Self::EventType, context: EventContext<TState, TComponentManager>) -> Option<EventResult>;
fn init(&mut self, ptr: ObjectRef, components: &mut TComponentManager);
fn remove(&mut self, ptr: ObjectRef, components: &mut TComponentManager);
}
impl <TState, TComponentManager, EventType: Any, O: Object<TState, TComponentManager, EventType = EventType>> LowObject<TState, TComponentManager> for O
{
fn on_event(&mut self, event: Box<dyn Any>, context: EventContext<TState, TComponentManager>) -> Option<EventResult>
{
if let Ok(ev) = event.downcast::<EventType>()
{
return self.event(&ev, context);
}
return None;
}
fn on_init(&mut self, ptr: ObjectRef, components: &mut TComponentManager)
{
self.init(ptr, components);
}
fn on_remove(&mut self, ptr: ObjectRef, components: &mut TComponentManager)
{
self.remove(ptr, components);
}
}