error = 'stack2.error'                       # when imported: local exception

class Stack:
    def __init__(self, start=[]):            # self is the instance object
        self.stack = []                      # start is any sequence: stack..
        for x in start: self.push(x) 
        self.reverse()                       # undo push's order reversal
    def push(self, obj):                     # methods: like module + self
        self.stack = [obj] + self.stack      # top is front of list
    def pop(self):	
        if not self.stack: raise error, 'underflow'
        top, self.stack = self.stack[0], self.stack[1:]
        return top
    def top(self):
        if not self.stack: raise error, 'underflow'
        return self.stack[0]
    def empty(self):
        return not self.stack                     # instance.empty()

    # overloads
    def __repr__(self):
        return '[Stack:%s]' % self.stack          # print, backquotes,..
    def __cmp__(self, other):                
        return cmp(self.stack, other.stack)       # '==', '>, '<=', '!=',..
    def __len__(self): 
        return len(self.stack)                    # len(instance), not instance
    def __add__(self, other): 
        return Stack(self.stack + other.stack)    # instance1 + instance2
    def __mul__(self, reps): 
        return Stack(self.stack * reps)           # instance * reps
    def __getitem__(self, offset):     
        return self.stack[offset]                 # intance[offset], in, for
    def __getslice__(self, low, high):  
        return Stack(self.stack[low : high])      # instance[low:high]
    def __getattr__(self, name):
        return getattr(self.stack, name)          # instance.sort()/reverse()/..
