extracted vote behavior into Voteable module