use crate::export::user_data::UserData;
use crate::export::{class_registry, ClassBuilder};
use crate::object::ownership::{Ownership, Shared, Unique};
use crate::object::{GodotObject, Instance, Instanciable, TRef};
pub trait NativeClass: Sized + 'static {
type Base: GodotObject;
type UserData: UserData<Target = Self>;
#[inline]
fn nativeclass_init(_owner: TRef<'_, Self::Base, Shared>) -> Self {
panic!(
"{} does not have a zero-argument constructor",
class_registry::class_name_or_default::<Self>()
)
}
#[inline]
fn nativeclass_register_properties(_builder: &ClassBuilder<Self>) {}
#[inline]
fn new_instance() -> Instance<Self, Unique>
where
Self::Base: Instanciable,
{
Instance::new()
}
#[inline]
fn emplace(self) -> Instance<Self, Unique>
where
Self::Base: Instanciable,
{
Instance::emplace(self)
}
}
pub trait StaticallyNamed: NativeClass {
const CLASS_NAME: &'static str;
#[inline]
fn nativeclass_register_monomorphized(_builder: &ClassBuilder<Self>) {}
}
pub trait NativeClassMethods: NativeClass {
fn nativeclass_register(builder: &ClassBuilder<Self>);
}
pub trait OwnerArg<'a, T: GodotObject, Own: Ownership + 'static>: private::Sealed {
#[doc(hidden)]
fn from_safe_ref(owner: TRef<'a, T, Own>) -> Self;
}
impl<'a, T> private::Sealed for &'a T where T: GodotObject {}
impl<'a, T, Own> OwnerArg<'a, T, Own> for &'a T
where
T: GodotObject,
Own: Ownership + 'static,
{
#[inline]
fn from_safe_ref(owner: TRef<'a, T, Own>) -> Self {
owner.as_ref()
}
}
impl<'a, T, Own> private::Sealed for TRef<'a, T, Own>
where
T: GodotObject,
Own: Ownership + 'static,
{
}
impl<'a, T, Own> OwnerArg<'a, T, Own> for TRef<'a, T, Own>
where
T: GodotObject,
Own: Ownership + 'static,
{
#[inline]
fn from_safe_ref(owner: TRef<'a, T, Own>) -> Self {
owner
}
}
mod private {
pub trait Sealed {}
}