The general idea is to build an adaptor object that holds a capability to an object of earlier design called here the base object. The adaptor serves as a wrapped version of the base object. The conceptual state of the adaptor is related somehow to the state of the base object. The code of the adaptor intercepts the invocation messages and perhaps the response messages as well. It is in a position to transform the semantics of the base object.

There are a variety of situations where adaptors arise:

There are two common patterns for creating adaptors: Often the adaptor need not process the response and tail call optimization can eliminate an extra copying of the response. Keykos does this by the adaptor invoking the base object with a return invocation passing its invoker's resume key as the continuation.

Wrappers can be provided externally, even by another agency in another trust domain. The externally provided wrapper or facet does not increase the TCB of those clients that do not need the facets or wrappers.

For some purposes it is important that the wrapper hold the only capability to the base object. This is true at least when it is important that a particular slot is the only slot holding a capability to a wrapper. This is a common requirement in security arguments. This situation needs a name but I have none now.

Here is the special case of wrapping a legacy application.

Just about any object language provides this wrapper pattern.