This is based on the discussion can.l and I am having in appdev. It's mostly about information hiding. Strictly speaking, you can always access everything if you know the right levers to pull. It's just what is enough of a signal to make the user understand they're doing weird shit. Using private object fields that require usage of std/Importutils is one way. Using a distinct type is another. Just a matter of if distinct type casting is "strong enough" of a marker.