diff --git a/src/bitmap.rs b/src/bitmap.rs
index c07fa07..aa2309c 100644
--- a/src/bitmap.rs
+++ b/src/bitmap.rs
@@ -28,11 +28,6 @@ impl Bitmap {
         ).unwrap())
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn set(&self, x: u64, y: u64, value: bool) {
         self.actual
             .write()
diff --git a/src/bitvec.rs b/src/bitvec.rs
index e9356fd..ef216f5 100644
--- a/src/bitvec.rs
+++ b/src/bitvec.rs
@@ -14,11 +14,6 @@ impl BitVec {
         Self::internal_new(servicepoint::DisplayBitVec::from_slice(&data))
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn set(&self, index: u64, value: bool) {
         self.actual.write().unwrap().set(index as usize, value)
     }
diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs
index ca64ebf..956f139 100644
--- a/src/brightness_grid.rs
+++ b/src/brightness_grid.rs
@@ -23,11 +23,6 @@ impl BrightnessGrid {
         ).unwrap())
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn set(&self, x: u64, y: u64, value: u8) {
         self.actual.write().unwrap().set(
             x as usize,
diff --git a/src/char_grid.rs b/src/char_grid.rs
index 8bf70ac..1f39e1c 100644
--- a/src/char_grid.rs
+++ b/src/char_grid.rs
@@ -31,11 +31,6 @@ impl CharGrid {
         Self::internal_new(servicepoint::CharGrid::from(&*data))
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn set(
         &self,
         x: u64,
diff --git a/src/command.rs b/src/command.rs
index 5939761..aaf508c 100644
--- a/src/command.rs
+++ b/src/command.rs
@@ -116,11 +116,6 @@ impl Command {
         Self::internal_new(actual.into())
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn equals(&self, other: &Command) -> bool {
         *self.actual.read().unwrap() == *other.actual.read().unwrap()
     }
diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs
index 7ca1e62..9db5d8e 100644
--- a/src/cp437_grid.rs
+++ b/src/cp437_grid.rs
@@ -24,11 +24,6 @@ impl Cp437Grid {
         ).unwrap())
     }
 
-    #[uniffi::constructor]
-    pub fn clone(other: &Arc<Self>) -> Arc<Self> {
-        Self::internal_new(other.actual.read().unwrap().clone())
-    }
-
     pub fn set(&self, x: u64, y: u64, value: u8) {
         self.actual
             .write()
diff --git a/src/macros.rs b/src/macros.rs
index 8f46c1c..b22b12a 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -13,6 +13,14 @@ macro_rules! wrap_uniffi_object {
                 })
             }
         }
+         
+        #[uniffi::export]
+        impl $new_t {
+            #[uniffi::constructor]
+            pub fn clone(other: &Arc<Self>) -> Arc<Self> {
+                Self::internal_new(other.actual.read().unwrap().clone())
+            }
+        }
      };
     ($t:ident) => {
         wrap_uniffi_object!($t, $t);