## §7.1 Opaque roles

The purpose of the two `IConfined` interfaces (see §6.2.(a)) is to define opaque roles: Any role implementing `IConfined` can be externalized using this type, such that external clients cannot access any features of the role. The type `IConfined` exposes no features and references of this type cannot be widened to any type not even to `java.lang.Object`.
If the actual role type is furthermore invisible outside the team (by not declaring it `public`), it is perfectly safe to externalize such roles using type `IConfined` (which is a public interface) and pass them back to the owning team. The encapsulation of the team is in no way breached by externalizing opaque roles, which can only be used as a handle into internal state of the team.

The difference between the two mentioned interfaces is that `ITeam.IConfined` requires to use this type or any subtype as externalized role. Such a reference contains the information of the enclosing team. Even stricter control can be imposed using the regular interface `IConfined`. Here not even team membership is visible to clients using a reference of this type.