Jigged things around, using a Rule type to convey rules... added small amounts of exceptions, made things a little nicer to work with.