Require Pin<&mut CxxString> for push
diff --git a/src/cxx_string.rs b/src/cxx_string.rs
index 7ee8987..1295e88 100644
--- a/src/cxx_string.rs
+++ b/src/cxx_string.rs
@@ -2,6 +2,7 @@
 use alloc::string::String;
 use core::fmt::{self, Debug, Display};
 use core::marker::{PhantomData, PhantomPinned};
+use core::pin::Pin;
 use core::slice;
 use core::str::{self, Utf8Error};
 
@@ -88,13 +89,16 @@
     }
 
     /// Appends a given string slice onto the end of this C++ string.
-    pub fn push_str(&mut self, s: &str) {
+    pub fn push_str(self: Pin<&mut Self>, s: &str) {
         self.push_bytes(s.as_bytes());
     }
 
     /// Appends arbitrary bytes onto the end of this C++ string.
-    pub fn push_bytes(&mut self, bytes: &[u8]) {
-        unsafe { string_push(self, bytes.as_ptr(), bytes.len()) }
+    pub fn push_bytes(self: Pin<&mut Self>, bytes: &[u8]) {
+        unsafe {
+            let this = Pin::into_inner_unchecked(self);
+            string_push(this, bytes.as_ptr(), bytes.len())
+        }
     }
 }