#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Example:
    def __init__(self, aA, aB):
        self._a = aA
        self._b = aB

    def setA(self, aA):
        self._a = aA
        return True

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

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

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

    def delete(self):
        pass

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

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Item:
    """
    R1: track quality items
    [Quality: Performance, Security]
    """

    def __init__(self, aName):
        self._name = aName

    def setName(self, aName):
        self._name = aName
        return True

    def getName(self):
        return self._name

    def delete(self):
        pass

    def __str__(self):
        return (super().__str__() + "["
                + "name:" + str(self.getName())
                + "]")

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Example:
    def __init__(self):
        pass

    def delete(self):
        pass

    def methodName(self):
        """R01: this is a requirement for a method"""
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Example:
    """R01: this is a requirement"""

    def __init__(self):
        pass

    def delete(self):
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class X:
    """R1: There should be a class called X"""

    def __init__(self, aA, aB):
        self._a = aA
        self._b = aB
        self._ies = []

    def setA(self, aA):
        self._a = aA
        return True

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

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

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

    def getY(self, index):
        return self._ies[index]

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

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

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

    def indexOfY(self, aY):
        return next((i for i, x in enumerate(self._ies) if x is aY), -1)

    @staticmethod
    def minimumNumberOfIes():
        return 0

    def addY1(self, aC):
        from Y import Y
        return Y(aC, self)

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

    def addY(self, *args, **kwargs):
        from Y import Y
        bound = __class__._bindArguments(("aY",), False, args, kwargs)
        if bound is not None and (bound[0] is None or isinstance(bound[0], Y)):
            return __class__.addY2(self, *bound)
        bound = __class__._bindArguments(("aC",), False, args, kwargs)
        if bound is not None and (bound[0] is None or isinstance(bound[0], str)):
            return __class__.addY1(self, *bound)
        raise TypeError("No method matches provided parameters")

    def removeY(self, aY):
        if aY.getX() is self:
            return False
        index = next((i for i, x in enumerate(self._ies) if x is aY), -1)
        if index >= 0:
            del self._ies[index]
        return True

    def addYAt(self, aY, index):
        if not self.addY2(aY):
            return False
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def addOrMoveYAt(self, aY, index):
        if not any(x is aY for x in self._ies):
            return self.addYAt(aY, index)
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def delete(self):
        for i in range(len(self._ies), 0, -1):
            aY = self._ies[i - 1]
            aY.delete()

    @staticmethod
    def _bindArguments(names, varargs, args, kwargs):
        if len(args) > len(names) and not varargs:
            return None
        bound = list(args[:len(names)])
        for name in names[len(bound):]:
            if name not in kwargs:
                return None
            bound.append(kwargs[name])
        if len(kwargs) != len(names) - min(len(args), len(names)):
            return None
        if varargs:
            bound.append(args[len(names):])
        return bound

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

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Y:
    """
    This is class Y
    R3: There must be a class called Y
    """

    def __init__(self, aC, aX):
        self._c = aC
        self._x = None
        if not self.setX(aX):
            raise RuntimeError("Unable to create y due to x. See https://manual.umple.org?RE002ViolationofAssociationMultiplicity.html")

    def setC(self, aC):
        self._c = aC
        return True

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

    def getX(self):
        return self._x

    def setX(self, aX):
        if aX is None:
            return False
        existingX = self._x
        self._x = aX
        if existingX is not None and existingX is not aX:
            existingX.removeY(self)
        self._x.addY(self)
        return True

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

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