macro_rules! impl_dep_obj_impl {
    (
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*]
        $Id:ty {
            $($objs:tt)*
        }
    ) => { ... };
    (
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*]
        $token:tt $($tail:tt)*
    ) => { ... };
    (
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> ($Obj:ty) { $StatePart:ty | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> ($Obj:ty) { $StatePart:ty { . $state_part_field:tt } | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> optional ($Obj:ty) { $StatePart:ty | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> optional ($Obj:ty) { $StatePart:ty { . $state_part_field:tt } | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> dyn($Obj:path) { $StatePart:ty | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> dyn($Obj:path) { $StatePart:ty { . $state_part_field:tt } | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> optional dyn($Obj:path) { $StatePart:ty | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [ fn<$DepObjKey:tt>() -> optional dyn($Obj:path) { $StatePart:ty { . $state_part_field:tt } | . $component_field:tt } $($tail:tt)* ]
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$([[$ty_Obj:ty] [$ty_Key:ty] [$ty_StatePart:ty] [$($ty_state_part_field:tt)*] [$($ty_component_field:tt)*]])*]
        [$([[$opt_ty_Obj:ty] [$opt_ty_Key:ty] [$opt_ty_StatePart:ty] [$($opt_ty_state_part_field:tt)*] [$($opt_ty_component_field:tt)*]])*]
        [$([[$tr_Obj:path] [$tr_Key:ty] [$tr_StatePart:ty] [$($tr_state_part_field:tt)*] [$($tr_component_field:tt)*]])*]
        [$([[$opt_tr_Obj:path] [$opt_tr_Key:ty] [$opt_tr_StatePart:ty] [$($opt_tr_state_part_field:tt)*] [$($opt_tr_component_field:tt)*]])*]
        []
    ) => { ... };
    (
        @objs
        [$($g:tt)*] [$($r:tt)*] [$($w:tt)*] [$Id:ty]
        [$($ty:tt)*] [$($opt_ty:tt)*] [$($tr:tt)*] [$($opt_tr:tt)*]
        [$token:tt $($tail:tt)*]
    ) => { ... };
}