It can be highlighted that there is no ATL rule where the source pattern matches elements being instances of CSPClass**. Thus, they are implicitly removed from** models (obviously no rule creates class instances). The second transformation removes records to get flattened variables (see Figure 8).

![0_image_0.png](0_image_0.png)

In Figure 7, the first rule (lines 1 to 8) is used to copy the root concept of model. Most of other concepts are duplicated with similar rules like the the second one (lines 9 to 22). The helper mustBeDuplicated **is defined for each**
CSPModelFeature and it returns true when: (1) the considered element is an object variable (its type is a class) or (2) it is a feature of a class. Using **the last**
rule, object variables are replaced by records. The helper isObject **returns true** only if the type of variables is a class. In this rule, features of variable classes are browsed using OCL navigation (collect **statement over** s.type.features). The rule duplicate **is applied on each feature. This rule is lazy and abstract. It** is specialized for each CSPModelFeature **concrete sub-concepts and it creates as** many features as it is called.