
class Cell:

    def __init__(self,
                 meter="*",
                 rhyming_cell=None,
                 word_terminal=0,
                 sentence_terminal=0,
                 stanza_terminal=0):
        # Cell Binding
        self.__word     = None
        self.__word_syl = -1
        self.__pos      = None
        self.__subcell  = None

        # Cell Specifications
        self.__meter             = meter
        self.__rhyming_cell      = rhyming_cell        
        self.__word_terminal     = word_terminal
        self.__sentence_terminal = sentence_terminal
        self.__stanza_terminal   = stanza_terminal


    ###
    ### Cell Bindings
    ###

    def is_bound(self):
        return self.__word is not None

    def get_word(self):
        return self.__word

    def get_word_syllable(self):
        return self.__word_syl

    def get_pos(self):
        return self.__pos

    def has_subcell(self):
        return self.__subcell is not None

    def get_subcell(self):
        return self.__subcell

    def bind(self, pos, word, i):
        assert 0 <= i < word.get_syllables()
        self.__pos = pos
        self.__word = word
        self.__word_syl = i

    def unbind(self):
        self.__word = None
        self.__word_syl = -1
        self.__pos = None
        self.__subcell = None
        

    ###
    ### Cell Specifications
    ###

    def get_meter(self):
        return self.__meter

    def get_rhyming_cell(self):
        return self.__rhymes_with

    def is_word_terminal(self):
        return self.__word_terminal

    def is_sentence_terminal(self):
        return self.__sentence_terminal

    def is_stanza_terminal(self):
        return self.__stanza_terminal


class Poem:

    def __init__(self):
        self.__leading_subcell = None
        self.__cells = []

    def add_cell(self, c):
        self.__cells.append(c)

    def get_leading_subcell(self):
        return self.__leading_subcell

    def __len__(self):
        return len(self.__cells)

    def __getitem__(self, i):
        return self.__cells[i]

    def __getslice__(self, i, j):
        return self.__cells[i:j]
    
    

class FixedSyllablePoem(Poem):

    def __init__(self, *syllables):
        Poem.__init__(self)

        for i in range(len(syllables)):
            n = syllables[i]
            for j in range(n):
                eol=(j == n-1)
                eostza = (i == len(syllables)-1)
                c = Cell(word_terminal=eol,
                         sentence_terminal=eol and eostza,
                         stanza_terminal=eol and eostza)
                self.add_cell(c)

