def attributes_nil_hash
      @_attributes_nil_hash ||= {}.tap do |attr_hash|
        registered_properties.each_pair do |k, prop_obj|
          val = prop_obj.default_value
          attr_hash[k.to_s] = val
        end
      end.freeze
    end
def attributes_nil_hash
      @_attributes_nil_hash ||= {}.tap do |attr_hash|
        registered_properties.each_pair do |k, prop_obj|
          val = prop_obj.default_value
          attr_hash[k.to_s] = val
        end
      end.freeze
    end
During object wrap, a hash is needed that contains each declared property with a nil value.
 The active_attr dependency is capable of providing this but it is expensive and calculated on the fly
 each time it is called. Rather than rely on that, we build this progressively as properties are registered.
 When the node or rel is loaded, this is used as a template.