Now that `update` and `merge` are consistently recursive by default, it's useful to have methods that mimic the old (shallow) behavior.
- optimize `properties` and `defaults` so they don't do a full ancestry lookup each time a property is accessed - API change: `properties` is now a Set of symbols (was Array of strings) - API change: `defaults` is a Hash with symbol keys and doesn't include properties without defaults - optimize generated accessors to skip lookup if a property exists - fixed accessing the dash with square brackets - change keys to be stored internally as strings instead of symbols - change initialization so it doesn't initialize properties without defaults to nil - allow creating a dash with a block that defines default values as fallback (regular Hash behavior) - allow redefining a property in descendants in order to set a new default value or clear the existing one - rewritten test suite to be more concise and better focused on what's important
`deep_update` was broken because it wasn't recursive at all. Also, since `merge` wasn't implemented in Mash it was also broken as a consequence of not normalizing the keys. This makes `merge` deep by default to be consistent with `update` and `merge!` which were deep before.
…for the super class to not receive properties set on subclasses.