Listing One // Forward class Company; class BoardOfDirectors; class CompanyBoardProperties; class Company { public: Company() : CompanyBoardAssn ( *this ) { } string name; ASToOneProp< Company, BoardOfDirectors, CompanyBoardProperties > CompanyBoardAssn; }; class BoardOfDirectors { public: BoardOfDirectors() : CompanyBoardAssn ( *this ) {} ASToOneProp CompanyBoardAssn; }; class CompanyBoardProperties { public: CompanyBoardProperties( const long duration ) : m_duration( duration ) {} long m_duration; }; Listing Two Company company; BoardOfDirectors board; // Attach the board and the company - the board has served for 5 months company.CompanyBoardAssn.Attach( board.CompanyBoardAssn, *new CompanyBoardProperties( 5 ) ); Listing Three Class CompanyPure { public: string name; }; class BoardOfDirectorsPure { }; class Company : public CompanyPure { public: Company() : CompanyBoardAssn ( *this ) { } ASToOneProp< Company, BoardOfDirectors, CompanyBoardProperties > CompanyBoardAssn; // You can use any name you want }; class BoardOfDirectors : public BoardOfDirectorsPure { public: BoardOfDirectors() : CompanyBoardAssn ( *this ) {} ASToOneProp CompanyBoardAssn; // You use any name you want } Listing Four // Forward class Car; class Accessory; class CarAccessoryProperties; typedef AS_LIST_PROP( ListTempl, Car, Accessory, CarAccessoryProperties ) List; class Car { public: Car() : m_hasAccessories( *this, *new List ) { } ASToManyProp< Car, Accessory, CarAccessoryProperties > m_hasAccessories; }; class Accessory { public: Accessory() : m_installedIn( *this ) {} ASToOneProp m_installedIn; }; class CarAccessoryProperties { public: CarAccessoryProperties( long cost ) : m_installationCost( cost ) {} long m_installationCost; }; Example 1: Pointer-based implementation class Company { public: string name; }; class Board { public: Company *pCorporation; }; Example 2: (a) template class Association : public parentClass { linkClass *pLinkedObject; public: link( linkClass * ); getAssociatiedObject(); }; (b) class CompanyBase { public: string name; }; (c) class Company : public Association< CompanyBase, BoardOfDirectors > { }; Example 3: (a) class Company { public: string name; }; class BoardOfDirectors { }; (b) Company company; BoardOfDirectors board; (c) ASToOneProp< Company, BoardOfDirectors, CompanyBoardProperties > company_link(company); (d) ASToOneProp< BoardOfDirectors, Company, CompanyBoardProperties > board_link(board); (e) company_link.Attach(board_link, *new Properties(1)); Example 4: (a) Car car; Accessory acc1; Accessory acc2; Accessory acc3; (b) car.m_hasAccessories.Attach( acc1.m_installedIn, *new CarAccessoryProperties( 500 ) ); acc2.m_installedIn.Attach( car.m_hasAccessories, *new CarAccessoryProperties( 1000 ) ); acc3.m_installedIn.Attach( car.m_hasAccessories, *new CarAccessoryProperties( 7000 ) ); (c) typedef AS_ITER_ADAPTER_PROP( Car, Accessory, CarAccessoryProperties ) Iterator; Iterator *pIterator = car.m_hasAccessories.GetRhsObjects().Iterate(); for ( ; !pIterator -> AtEnd(); pIterator -> Next() ) { printf( "Cost %d\n", pIterator->GetCurrent().GetProperties() .m_installationCost ); } delete pIterator; Example 5: (a) for ( ; !pIterator -> AtEnd(); pIterator -> Next() ) { printf( "Many link: %d\n", pIterator->GetCurrent().i ); } (b) for ( ; !pIterator -> AtEnd(); pIterator -> Next() ) { printf( "Many link: %d\n", pIterator->GetCurrent().GetLhsObject().i ); }