I was thinking the other way around, start with DEFAULTS and merge in ahash, so it overwrites any defaults that are set.  The bit in initialize_default_values I particularly don't like is calling ostruct internals, when a simple hash merge would suffice.