borrowing six's add_metaclass to fix python 3 change on ABCMeta