A composer is used to map a single class attribute to multiple database columns. For example, in the Bank sample, the name for VapCustomer is mapped to three fields in the CUSTOMER table: FIRSTNAME, MIDINIT, and LASTNAME. If a composer does not exist that matches your data, you can create one by creating a new subclass of VapCustomer.
Note that composed attributes used as keys are not supported.
In this example, the VapNameComposer was created.
Do the following:
^#('firstName' 'middle' 'lastName')
^VapName first: (array at: 1) middle: (array at: 2) last: (array at: 3))
For example,
^#(String String String)
^(Array
with: anObject firstName
with anObject middle
with: anObject last)
The VapName class is used in the Bank sample to map one attribute to several columns. It was used as follows:
This opens the Class Editor.
This opens the Attribute Editor.

VapName appears in the Type list because the new subclass of VapComposer, VapNameComposer, was recognized with VapName as its target type. The target type of any VapComposer subclasses you create will also appear here.
This concludes the example.
Changing part of a composed attribute like name does not cause the Customer object to be marked "dirty" and updated in the database. To make the Customer object dirty because of a name change, you must alter the name attribute through the Customer's setName accessor.
Also note that if you have a complex attribute type and you want to change the composer type, you must delete the complex attribute map from the Map Browser and recreate it in the Property Map Editor.