Note that OCL lets us specify both the interface of the component and the externally observable side-effects of each method. OCL does not let the designer specify implementation details, such as how the size attribute is manipulated. Contrast this with the Object-Z specification of the same stack in Figure 4 . Finally, some languages support the specification of both an entities interface and its operational behavior. It is clear from this example that, while we can specify everything about the behavior and interface of a component with a language like Object-Z, it is entirely too complex for nearly all developers.
Proofs based upon such specifications are often very complex and subtle.
These languages let us specify the syntactic interface and type system of a component in a language-independent manner. These languages let us specify the syntactic interface and type system of a component and the externally observable behavior of its methods. They also do not let us specify anything about the internal behavior of components. Finally, none of the above languages can capture the higher-order semantics of components or specifications nor the relationships between such constructs. This theoretic model provides classes, types, encapsulation, dynamic polymorphic method invocation, constrained parametric generic classes, and multiple inheritance.