add trait methods
add factory method