import fMM : 'Families.ecore#/';
import pMM : 'Persons.ecore#/';
import f2pMM : 'Families2Persons.ecore#/';

transformation org::eclipse::qvtd::xtext::qvtcore::tests::families2persons::Families2Persons
{
	family imports Families;
	person imports Persons;
	imports Families2Persons;
}

map Member2Male in Families2Persons
{
	check family(s : Member[1]
	|
		isFemale(s).not2();) {}

	enforce person() {
		realize t : Male
	|}

	where() {
		realize m2m : f2pMM::Member2Male
	|
		m2m.member := s;
		m2m.person := t;
	}

	map
	{

		where() {
			t.fullName := s.firstName + ' ' + familyName(s);
		}
	}
}

map Member2Female in Families2Persons
{
	check family(s : Member[1]
	|
		isFemale(s);) {}

	enforce person() {
		realize t : Female
	|}

	where() {
		realize m2m : f2pMM::Member2Female
	|
		m2m.member := s;
		m2m.person := t;
	}

	map
	{

		where() {
			t.fullName := s.firstName + ' ' + familyName(s);
		}
	}
}

query Families2Persons::familyName(member : fMM::Member[1]) : String[1]
{
	if member.familyFather.oclIsUndefined().not2() then member.familyFather.lastName else if
			member.familyMother.oclIsUndefined().not2() then member.familyMother.lastName else if member.familySon.oclIsUndefined().not2()
			then member.familySon.lastName else member.familyDaughter.lastName endif endif endif
}

query Families2Persons::isFemale(member : fMM::Member[1]) : Boolean[1]
{
	if member.familyMother.oclIsUndefined().not2() then true
	else if member.familyDaughter.oclIsUndefined().not2() then true
		else false
		endif endif
}