Listen for when a physics object is removed from it's sleep state, and the reason for it

Is there a hook (or combination of hooks thereof) that I can use to listen for when any given physics object is removed from it’s sleeping state for any reason whatsoever, and also get that reason? Preferably, I’d also like for this hook to be called on newly spawned props as well.
I know that there are hooks for physics collisions, but what about constraints acting upon props? Are there hooks for when a player collides with a physics object?
Is this even possible under every circumstance?

Perhaps you could override the method in its metatable and make it call a gamemode function?

[editline]11th March 2015[/editline]

actually I think I’m incredibly wrong on that one.

[editline]11th March 2015[/editline]

Best I can think of is this and it only works if you call them via Lua:

[lua]local PhysObj = debug.getregistry().PhysObj
PhysObj._Wake = PhysObj._Wake or PhysObj.Wake
PhysObj._Sleep = PhysObj._Sleep or PhysObj.Sleep

function PhysObj.Wake( self )
print( "physobj wake: " … tostring( self ) )
self._Wake( self )

function PhysObj.Sleep( self )
print( "physobj sleep: " … tostring( self ) )
self._Sleep( self )

[editline]11th March 2015[/editline]

For the physics collide, couldn’t you just use the entity the physics object is tied to?