use trait for router