I don't really get why it's called "push." maybe some comments should be added