use static factory methods for more flexibility with implementations
add validation to command execution