macro_rules! object_reference {
    ($reference_name:ident: $owned_name:ident) => {
        pub struct $reference_name {
            inner: bindgen_prelude::ObjectRef,
        }

        impl $reference_name {
            pub fn get_inner<'env>(
                &self,
                env: &'env napi::Env,
            ) -> Result<$owned_name<'env>, napi::Error> {
                let inner = self.inner.get_value(env)?;

                Ok($owned_name { inner })
            }
        }

        impl<'env> $owned_name<'env> {
            pub fn create_ref(&self) -> Result<$reference_name, napi::Error> {
                let inner = self.inner.create_ref()?;

                Ok($reference_name { inner })
            }
        }
    };
}

pub(crate) use object_reference;