There's a good reason why most designs ignore that part of the spec and just assume the maximum current limit can be drawn, and with USB 3.0 it gets even more obvious - you basically need to implement all of the USB protocol layers, except for actually doing data transfers.
This includes the physical layer (symbol encoder/scrambler, link initialization, clock jitter recovery, etc.), link layer with all its packet rx/tx logic and associated error recovery, and then the protocol layer with its logic (USB 2.0 and 1.x did not have much more than the protocol layer, and the physical layer was much simpler.)
With USB 1.x it wasn't too bad, you could bit-bang the interface with a fast MCU.
To say it simply, the actual power capabilities are stored in the device configuration descriptor's bMaxPower member (see page 378 of the current 3.0 standard). Doing the handshake to establish the link and then giving that information to the host is where all the complexity is.