@gcalderone In practise I’ve ended up using a mix of what you are calling composition and encapsulation, although I’m not used to them being described that way - I would call your encapsulation aggregation (which I thought was a subset of composition), and leave encapsulation to oop access restriction… but none of these terms really make sense to me any more in julia.
I use Mixers.jl when I have multiple types that share a subset of fields and macros.
I’m even thinking about using empty concrete types fully made with mixins, so custom types can be made later without boilerplate.