# Nano-COM
See [Nano-COM](https://en.wikipedia.org/wiki/Component_Object_Model#Nano-COM_(a.k.a_XPCOM)).
## Function Stack
- a public function.
```rust
let o: Object<IMy> = ...;
let i: u32 = o.B();
```
```rust
trait IMyEx {
fn B(&self) -> u32;
}
impl IMyEx for Object<IMy> {
fn B(&self) -> u32 {
unsafe { (self.interface().B()(self) }
}
}
```
- a virtual function.
```rust
#[repr(C)]
pub struct IMy {
pub B: unsafe extern "stdcall" fn(this: &Object<IMy>) -> u32
}
trait IMyVmtFn: Class<Interface = IMy>
where
CObject<Self>: IMyEx
{
extern "stdcall" fn B(this: &Object<IMy>) -> u32 {
unsafe { Self::to_cobject(this) }.B()
}
}
```
- a function implementation.
```rust
trait IMyEx {
fn B(&self) -> u32;
}
impl IMyEx for CObject<X> {
fn B(&self) -> u32 {
self.value.0
}
}
```