allows negative numeric arguments

This PR completely rips the code from #329 because I'd love to use it. Thanks to @jeromedecoster for this!
I’d recommend using `?` instead of `{0,1}` (means the same thing, just shorter). Other than that, looks good to me.