In terms of macros to avoid boilerplate code using type composition, I wrote this recently:
It takes care of boilerplate fields, parametric types and macros in a fully automated way, you just write a struct with the @mix macro in front of it:
@mix @with_kw struct Foo{T}
bar:T = 100
end
Then use @Foo as a macro in front of other structs and voila. Fields, types, macros, default params, whatever. You can even chain them, and apply the @Foo macro to another @mix macro to merge them.