move a lot of observance logic into ObservanceDecorator