An interface is passed to the generic interface and implementation modules as arguments, and the compiler will generate concrete modules. For example, one could define a GenericStack, then instantiate it with interfaces such as codice_24, or codice_25, or even interfaces to Objects, as long as each of those interfaces defines the properties needed by the generic modules. The bare types codice_26, or codice_20 can't be used, because they are not modules, and the system of generics is based on using modules as arguments. By comparison, in a C++ template, a bare type would be used. FILE: IntegerElem.i3 FILE: GenericStack.ig FILE: GenericStack.mg FILE: IntegerStack.i3 INTERFACE IntegerStack = GenericStack(IntegerElem) END IntegerStack. FILE: IntegerStack.m3 MODULE IntegerStack = GenericStack(IntegerElem) END IntegerStack. Any identifier can be traced back to where it originated, unlike the 'include' feature of other languages. A compiled unit must import identifiers from other compiled units, using an codice_11 statement. Even enumerations make use of the same 'dot' notation as used when accessing a field of a record. INTERFACE A;  TYPE Color = {Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Gray, White};  END A; MODULE B;  IMPORT A; FROM A IMPORT Color;  VAR  BEGIN END B. Modula-3 supports the allocation of data at runtime. There are two kinds of memory that can be allocated, codice_29 and codice_30, the difference being whether the garbage collector can see it or not. codice_31 is used to allocate data of either of these classes of memory. In an codice_16 module, codice_33 is available to free untraced memory. Object-oriented programming techniques may be used in Modula-3, but their use is not needed. Many of the other features provided in Modula-3 (modules, generics) can usually take the place of object-orientation. Object support is intentionally kept to its simplest terms. An object type (termed a "class" in other object-oriented languages) is introduced with the codice_34 declaration, which has essentially the same syntax as a codice_35 declaration, although an object type is a reference type, whereas RECORDs in Modula-3 are not (similar to structs in C).