add command pattern
add adapter pattern