# -*- coding: utf-8 -*-
"""
Mix-ins for bound classes
"""

class NeedsStart(object):
    """
    This mixin enforces Start/Finish routines
    """
    started = False
    def prepare(self):
        """
        Enforce Suspend/Start
        """
        if self.api.prepare():
            if not self.started:
                self.Start()
            return self.started
        else:
            return False
        
    def Start(self):
        if self.started:
            return True
        
        if self.api.prepare():
            self.started = self.cls.Start(self)
            if self.started:
                self.api.started.append(self)
            return self.started
        else:
            return False
        
    start = Start
        
    def Finish(self):
        if self.started:
            self.cls.Finish(self)
            self.started = False
            if self in self.api.started:
                self.api.started.remove(self)

    finish = Finish

class NoStart(object):
    """
    This mixin enforces Suspend, and disables Start/Finish
    """
    def prepare(self):
        """
        Enforce Suspend
        """
        return self.api.prepare()
        
    def Start(self):
        raise Exception("{0.cls} does not need Start()".format(self))

    start = Start
        
    def Finish(self):
        raise Exception("{0.cls} does not need Finish()".format(self))

    finish = Finish