macro_rules! external_methods {
    (
        $(#[$meta: meta])*
        fn $method_name:ident(&self$(, $method_args:ident: $method_types:ty)* $(,)?) -> $method_output:ty;
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident(&self$(, $method_args:ident: $method_types:ty)* $(,)?);
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident(&mut self$(, $method_args:ident: $method_types:ty)* $(,)?) -> $method_output:ty;
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident(&mut self$(, $method_args:ident: $method_types:ty)* $(,)?);
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident(self$(, $method_args:ident: $method_types:ty)* $(,)?) -> $method_output:ty;
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident(self$(, $method_args:ident: $method_types:ty)* $(,)?);
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident($($method_args:ident: $method_types:ty),* $(,)?) -> $method_output:ty;
        $($rest:tt)*
    ) => { ... };
    (
        $(#[$meta: meta])*
        fn $method_name:ident($($method_args:ident: $method_types:ty),* $(,)?);
        $($rest:tt)*
    ) => { ... };
    () => { ... };
}