$DQN->punch()->kick()->headbutt()->throw();

不変オブジェクトの場合は、
フルボッコされたDQNが返却されるけど元の$DQNはピンピンしてる

そうじゃないオブジェクトの場合は
フルボッコにされたDQNが返却され、元の$DQNもフルボッコにされてる

後者の場合は、たとえば$DQNを他の関数の引数に渡した場合に
関数内部で$DQNが変化してしまう可能性があるんだ
だから常に$DQNの内部状態に気を払っておかねばならない

でも普遍オブジェクトなら$DQNは常に変更されないから
気兼ねなく他の関数の引数として渡すことができる