#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
# line 27 "../ReflexiveAssociationTest.ump"

class OneToMany():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #OneToMany Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aOneToMany):
        self._oneToMany = None
        if not self.setOneToMany(aOneToMany) :
            raise RuntimeError ("Unable to create OneToMany due to aOneToMany. See https://manual.umple.org?RE002ViolationofAssociationMultiplicity.html")

    #------------------------
    # INTERFACE
    #------------------------
    # Code from template association_GetOne 
    def getOneToMany(self):
        return self._oneToMany

    # Code from template association_SetUnidirectionalOne 
    def setOneToMany(self, aNewOneToMany):
        wasSet = False
        if not (aNewOneToMany is None) :
            self._oneToMany = aNewOneToMany
            wasSet = True
        return wasSet

    def delete(self):
        self._oneToMany = None


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
# line 9 "../ReflexiveAssociationTest.ump"

class Student():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #Student Attributes
    #Student Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aNumber):
        self._ta = None
        self._pupil = None
        self._number = None
        self._number = aNumber

    #------------------------
    # INTERFACE
    #------------------------
    def setNumber(self, aNumber):
        wasSet = False
        self._number = aNumber
        wasSet = True
        return wasSet

    def getNumber(self):
        return self._number

    # Code from template association_GetOne 
    def getPupil(self):
        return self._pupil

    def hasPupil(self):
        has = not (self._pupil is None)
        return has

    # Code from template association_GetOne 
    def getTa(self):
        return self._ta

    def hasTa(self):
        has = not (self._ta is None)
        return has

    # Code from template association_SetOptionalOneToOptionalOne 
    def setPupil(self, aNewPupil):
        wasSet = False
        if aNewPupil is None :
            existingPupil = self._pupil
            self._pupil = None
            if not (existingPupil is None) and not (existingPupil.getTa() is None) :
                existingPupil.setTa(None)
            wasSet = True
            return wasSet
        currentPupil = self.getPupil()
        if not (currentPupil is None) and not currentPupil == aNewPupil :
            currentPupil.setTa(None)
        self._pupil = aNewPupil
        existingTa = aNewPupil.getTa()
        if not self == existingTa :
            aNewPupil.setTa(self)
        wasSet = True
        return wasSet

    # Code from template association_SetOptionalOneToOptionalOne 
    def setTa(self, aNewTa):
        wasSet = False
        if aNewTa is None :
            existingTa = self._ta
            self._ta = None
            if not (existingTa is None) and not (existingTa.getPupil() is None) :
                existingTa.setPupil(None)
            wasSet = True
            return wasSet
        currentTa = self.getTa()
        if not (currentTa is None) and not currentTa == aNewTa :
            currentTa.setPupil(None)
        self._ta = aNewTa
        existingPupil = aNewTa.getPupil()
        if not self == existingPupil :
            aNewTa.setPupil(self)
        wasSet = True
        return wasSet

    def delete(self):
        if not (self._pupil is None) :
            self._pupil.setTa(None)
        if not (self._ta is None) :
            self._ta.setPupil(None)

    def __str__(self):
        return str(super().__str__()) + "[" + "number" + ":" + str(self.getNumber()) + "]"


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
# line 15 "../ReflexiveAssociationTest.ump"
import os

class OneSymmetric():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #OneSymmetric Attributes
    #OneSymmetric Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    @classmethod
    def alternateConstructor(cls, aName, aNumber, aFriend):
        self = cls.__new__(cls)
        self._friend = None
        self._number = None
        self._name = None
        self._name = aName
        self._number = aNumber
        if aFriend is None or not (aFriend.getFriend() is None) :
            raise RuntimeError ("Unable to create OneSymmetric due to aFriend. See https://manual.umple.org?RE002ViolationofAssociationMultiplicity.html")
        self._friend = aFriend
        return self

    def __init__(self, aName, aNumber, aNameForFriend, aNumberForFriend):
        self._friend = None
        self._number = None
        self._name = None
        self._name = aName
        self._number = aNumber
        self._friend = OneSymmetric.alternateConstructor(aNameForFriend, aNumberForFriend, self)

    #------------------------
    # INTERFACE
    #------------------------
    def setName(self, aName):
        wasSet = False
        self._name = aName
        wasSet = True
        return wasSet

    def setNumber(self, aNumber):
        wasSet = False
        self._number = aNumber
        wasSet = True
        return wasSet

    def getName(self):
        return self._name

    def getNumber(self):
        return self._number

    # Code from template association_GetOne 
    def getFriend(self):
        return self._friend

    def delete(self):
        existingFriend = self._friend
        self._friend = None
        if not (existingFriend is None) :
            existingFriend.delete()

    def __str__(self):
        return str(super().__str__()) + "[" + "name" + ":" + str(self.getName()) + "," + "number" + ":" + str(self.getNumber()) + "]" + str(os.linesep) + "  " + "friend = " + ((format(id(self.getFriend()), "x")) if not (self.getFriend() is None) else "null")


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
# line 22 "../ReflexiveAssociationTest.ump"

class OneSymmetricNoParam():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #OneSymmetricNoParam Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    @classmethod
    def alternateConstructor(cls, aFriend):
        self = cls.__new__(cls)
        self._friend = None
        if aFriend is None or not (aFriend.getFriend() is None) :
            raise RuntimeError ("Unable to create OneSymmetricNoParam due to aFriend. See https://manual.umple.org?RE002ViolationofAssociationMultiplicity.html")
        self._friend = aFriend
        return self

    def __init__(self):
        self._friend = None
        self._friend = OneSymmetricNoParam.alternateConstructor(self)

    #------------------------
    # INTERFACE
    #------------------------
    # Code from template association_GetOne 
    def getFriend(self):
        return self._friend

    def delete(self):
        existingFriend = self._friend
        self._friend = None
        if not (existingFriend is None) :
            existingFriend.delete()


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
# line 3 "../ReflexiveAssociationTest.ump"
import os

class Mentor():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #Mentor Attributes
    #Mentor Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aName):
        self._superMentor = None
        self._name = None
        self._name = aName

    #------------------------
    # INTERFACE
    #------------------------
    def setName(self, aName):
        wasSet = False
        self._name = aName
        wasSet = True
        return wasSet

    def getName(self):
        return self._name

    # Code from template association_GetOne 
    def getSuperMentor(self):
        return self._superMentor

    def hasSuperMentor(self):
        has = not (self._superMentor is None)
        return has

    # Code from template association_SetOptionalOneToOptionalOne 
    def setSuperMentor(self, aNewSuperMentor):
        wasSet = False
        if aNewSuperMentor is None :
            existingSuperMentor = self._superMentor
            self._superMentor = None
            if not (existingSuperMentor is None) and not (existingSuperMentor.getSuperMentor() is None) :
                existingSuperMentor.setSuperMentor(None)
            wasSet = True
            return wasSet
        currentSuperMentor = self.getSuperMentor()
        if not (currentSuperMentor is None) and not currentSuperMentor == aNewSuperMentor :
            currentSuperMentor.setSuperMentor(None)
        self._superMentor = aNewSuperMentor
        existingSuperMentor = aNewSuperMentor.getSuperMentor()
        if not self == existingSuperMentor :
            aNewSuperMentor.setSuperMentor(self)
        wasSet = True
        return wasSet

    def delete(self):
        if not (self._superMentor is None) :
            self._superMentor.setSuperMentor(None)

    def __str__(self):
        return str(super().__str__()) + "[" + "name" + ":" + str(self.getName()) + "]" + str(os.linesep) + "  " + "superMentor = " + ((format(id(self.getSuperMentor()), "x")) if not (self.getSuperMentor() is None) else "null")