tested for Python 2.6, 2.7 and 3.3