Allows to do things before the command is executed, like skipping the command or changing the input.
Allows to handle throwables thrown while running a command.
Allows to inspect input and output of a command.
Allows to handle exception thrown in a command.
Allows to manipulate the exit code of a command after its execution.