refactoring, adding a abstract trait, adding lt/ge/gt/eq methods, additional tests