The `is_hypergeometric` function has to be made to look for a `Piecewise` and return True if all the expressions in the `Piecewise` are hypergeometric. But better, `Piecewise` should be able to respond to all `is_what` requests by returning a value based on all its args meeting that criteria. `Piecewise` already knows how to handle a rewrite request (e.g. `Piecewise((factorial(x),x>0),(1,True)).rewite(gamma)` works. I believe the `core.basic.rewrite` and `core.basic._eval_rewrite` are able to work out how to rewrite the args of Piecewise without Piecewise having all `_eval_rewrite_as_what`. It would be good if we could do the same thing for all `is_what` properties.