diff --git a/src/macros/implement.rs b/src/macros/implement.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1a06e588c8d2400e4b527dff44f14466dbbce243
--- /dev/null
+++ b/src/macros/implement.rs
@@ -0,0 +1,23 @@
+use proc_macro::TokenStream;
+use quote::{quote, ToTokens};
+use syn::{parse_macro_input, AttributeArgs, ItemFn, Meta, NestedMeta};
+
+pub(super) fn implement(args: TokenStream, input: TokenStream) -> TokenStream {
+	let args = parse_macro_input!(args as AttributeArgs);
+	let item = parse_macro_input!(input as ItemFn);
+
+	let NestedMeta::Meta(Meta::Path(receiver)) = args
+		.first()
+		.expect("missing path to trait or item to implement")
+	else {
+		panic!("invalid path to item for implement");
+	};
+
+	let out = quote! {
+		impl #receiver {
+			#item
+		}
+	};
+
+	out.into_token_stream().into()
+}
diff --git a/src/macros/mod.rs b/src/macros/mod.rs
index a0e61324ac18e700898ae89d05fa8a9fcab22a9a..8d7e2e5b755413423e4793d831cd7ff40bd3c238 100644
--- a/src/macros/mod.rs
+++ b/src/macros/mod.rs
@@ -1,6 +1,7 @@
 mod admin;
 mod cargo;
 mod debug;
+mod implement;
 mod refutable;
 mod rustc;
 mod utils;
@@ -23,3 +24,6 @@ pub fn rustc_flags_capture(args: TokenStream) -> TokenStream { rustc::flags_capt
 
 #[proc_macro_attribute]
 pub fn refutable(args: TokenStream, input: TokenStream) -> TokenStream { refutable::refutable(args, input) }
+
+#[proc_macro_attribute]
+pub fn implement(args: TokenStream, input: TokenStream) -> TokenStream { implement::implement(args, input) }