How does revocation work in E?
Revocation is done in user code using a pattern such as the following. This also shows the power of lambda-based facets:class revokerMaker(var underlying) :any { def forwarder { # Miranda methods other than printOn and reactToLostClient # generally shouldn’t be transparently forwarded to the underlying. to printOn(out) { underlying printOn(out) } to reactToLostClient(problem) { underlying reactToLostClient(problem) } # forwards all non-Miranda methods, so this pattern should # only be used if ‘underlying’ is known not to have any # protocol that gives itself away. Therefore, this is only # for ‘Cooperative (with the underlying) revocability’. # Uncooperative revocability requires the Membrane pattern, # for which we eventually expect to provide a library. delegate { underlying } } def revoker { to revoke() { underlying := null } # Dead-man switch: if a holder of the revoking facet is lost # (due to a network partition), then we can no longer locally # know that they don’t wish to revok