The system uses the one pup routine to do both packing and unpacking by passing different types of PUP::ers to it. You can determine what type of PUP::er has been passed to you with the p.isPacking(), p.isUnpacking(), and p.isSizing() methods. The p.isDeleting() method returns true if the pupped object will be deleted after packing.