Split RuleDSL into three sub-traits for better manageability
Simplify and fix `push` action
Simplify and fix `~>` action, add more tests