simplified the API using Trait and extra arguments parameter