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

class Example():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #Example Attributes
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aA, aB):
        self._b = None
        self._a = None
        self._a = aA
        self._b = aB

    #------------------------
    # INTERFACE
    #------------------------
    def setA(self, aA):
        wasSet = False
        self._a = aA
        wasSet = True
        return wasSet

    def setB(self, aB):
        wasSet = False
        self._b = aB
        wasSet = True
        return wasSet

    #*
    
    #   * R01: this is a requirement for an attribute
    
    #   
    def getA(self):
        return self._a

    #*
    
    #   * R01: this is a requirement for an attribute
    
    #   
    def getB(self):
        return self._b

    def delete(self):
        pass

    def __str__(self):
        return str(super().__str__()) + "[" + "a" + ":" + str(self.getA()) + "," + "b" + ":" + str(self.getB()) + "]"


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

class Example():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self):
        pass

    #------------------------
    # INTERFACE
    #------------------------
    def delete(self):
        pass

    #*
    
    #   * R01: this is a requirement for a method
    
    #   
    # line 7 "RequirementWithMethod.ump"
    def methodName(self):
        


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
#*

#   * R01: this is a requirement

#   
# line 1 "RequirementBeforeClass.ump"

class Example():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self):
        pass

    #------------------------
    # INTERFACE
    #------------------------
    def delete(self):
        pass


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
#*

#   * R1: There should be a class called X

#   
# line 19 "RequirementFullCheckWithComments.ump"

class X():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #X Attributes
    #X Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aA, aB):
        self._ies = None
        self._b = None
        self._a = None
        self._a = aA
        self._b = aB
        self._ies = []

    #------------------------
    # INTERFACE
    #------------------------
    def setA(self, aA):
        wasSet = False
        self._a = aA
        wasSet = True
        return wasSet

    def setB(self, aB):
        wasSet = False
        self._b = aB
        wasSet = True
        return wasSet

    #*
    
    #   * R1a: The reason it should be called X is because it is secret
    
    #   * R2: Class X should have several attribites
    
    #   
    def getA(self):
        return self._a

    #*
    
    #   * This is another attribute
    
    #   * R2: Class X should have several attribites
    
    #   
    def getB(self):
        return self._b

    # Code from template association_GetMany 
    def getY(self, index):
        aY = self._ies[index]
        return aY

    def getIes(self):
        newIes = tuple(self._ies)
        return newIes

    def numberOfIes(self):
        number = len(self._ies)
        return number

    def hasIes(self):
        has = len(self._ies) > 0
        return has

    def indexOfY(self, aY):
        index = (-1 if not aY in self._ies else self._ies.index(aY))
        return index

    # Code from template association_MinimumNumberOfMethod 
    @staticmethod
    def minimumNumberOfIes():
        return 0

    # Code from template association_AddManyToOne 
    def addY1(self, aC):
        from Y import Y
        return Y(aC, self)

    def addY2(self, aY):
        wasAdded = False
        if (aY) in self._ies :
            return False
        existingX = aY.getX()
        isNewX = not (existingX is None) and not self == existingX
        if isNewX :
            aY.setX(self)
        else :
            self._ies.append(aY)
        wasAdded = True
        return wasAdded

    def removeY(self, aY):
        wasRemoved = False
        #Unable to remove aY, as it must always have a x
        if not self == aY.getX() :
            self._ies.remove(aY)
            wasRemoved = True
        return wasRemoved

    # Code from template association_AddIndexControlFunctions 
    def addYAt(self, aY, index):
        wasAdded = False
        if self.addY(aY) :
            if index < 0 :
                index = 0
            if index > self.numberOfIes() :
                index = self.numberOfIes() - 1
            self._ies.remove(aY)
            self._ies.insert(index, aY)
            wasAdded = True
        return wasAdded

    def addOrMoveYAt(self, aY, index):
        wasAdded = False
        if (aY) in self._ies :
            if index < 0 :
                index = 0
            if index > self.numberOfIes() :
                index = self.numberOfIes() - 1
            self._ies.remove(aY)
            self._ies.insert(index, aY)
            wasAdded = True
        else :
            wasAdded = self.addYAt(aY, index)
        return wasAdded

    def delete(self):
        i = len(self._ies)
        while i > 0 :
            aY = self._ies[i - 1]
            aY.delete()
            i -= 1

    def __str__(self):
        return str(super().__str__()) + "[" + "a" + ":" + str(self.getA()) + "," + "b" + ":" + str(self.getB()) + "]"

    def addY(self, *argv):
        from Y import Y
        if len(argv) == 1 and isinstance(argv[0], str) :
            return self.addY1(argv[0])
        if len(argv) == 1 and isinstance(argv[0], Y) :
            return self.addY2(argv[0])
        raise TypeError("No method matches provided parameters")


#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.35.0.7523.c616a4dce modeling language!
#*

#   * This is class Y

#   * R3: There must be a class called Y

#   
# line 32 "RequirementFullCheckWithComments.ump"
import os

class Y():
    #------------------------
    # MEMBER VARIABLES
    #------------------------
    #Y Attributes
    #Y Associations
    #------------------------
    # CONSTRUCTOR
    #------------------------
    def __init__(self, aC, aX):
        self._x = None
        self._c = None
        self._c = aC
        didAddX = self.setX(aX)
        if not didAddX :
            raise RuntimeError ("Unable to create y due to x. See https://manual.umple.org?RE002ViolationofAssociationMultiplicity.html")

    #------------------------
    # INTERFACE
    #------------------------
    def setC(self, aC):
        wasSet = False
        self._c = aC
        wasSet = True
        return wasSet

    #*
    
    #   * This is an important attribute
    
    #   * R5: A Y should have a c
    
    #   
    def getC(self):
        return self._c

    # Code from template association_GetOne 
    def getX(self):
        return self._x

    # Code from template association_SetOneToMany 
    def setX(self, aX):
        wasSet = False
        if aX is None :
            return wasSet
        existingX = self._x
        self._x = aX
        if not (existingX is None) and not existingX == aX :
            existingX.removeY(self)
        self._x.addY(self)
        wasSet = True
        return wasSet

    def delete(self):
        placeholderX = self._x
        self._x = None
        if not (placeholderX is None) :
            placeholderX.removeY(self)

    def __str__(self):
        return str(super().__str__()) + "[" + "c" + ":" + str(self.getC()) + "]" + str(os.linesep) + "  " + "x = " + ((format(id(self.getX()), "x")) if not (self.getX() is None) else "null")