# File lib/cerealize.rb, line 78
78: def cerealize property, klass=nil, opt={}
79: opt[:encoding] ||= :marshal
80: cerealize_option[property] =
81: opt.merge(:class => klass,
82: :codec => Cerealize.codec_get(opt[:encoding]))
83:
84: field_orig = "#{property}_orig"
85: field_cache = "#{property}_cache"
86:
87: attr_accessor field_orig
88: private field_orig, "#{field_orig}="
89:
90: module_eval def #{field_cache} @#{property} end def #{field_cache}=(new_value) @#{property} = new_value end
91:
92: # Invariants:
93: # - instance_variable_defined?(field_cache) IFF the READER or WRITER has been called
94: # - instance_variable_defined?(field_pre) IFF the READER was called BEFORE
95: # any WRITER
96:
97: # READER method
98: #
99: module_eval def #{property} # See if no assignment yet if !#{field_cache} # Save property if not already saved if !#{field_orig} self.#{field_orig}= self[:#{property}] end # Set cached from pre v = cerealize_decode(:#{property}, #{field_orig}) raise ActiveRecord::SerializationTypeMismatch, "expected #{klass}, got \#{v.class}" \\ if #{klass || 'nil'} && !v.nil? && !v.kind_of?(#{klass}) self.#{field_cache} = v end # Return cached #{field_cache} end, __FILE__, __LINE__ + 1
100:
101: # WRITER method
102: #
103: module_eval def #{property}=(v) #{property}_will_change! if #{field_cache} != v self.#{field_cache} = v end, __FILE__, __LINE__ + 1
104:
105: # Callback for before_save
106: #
107: module_eval def #{property}_update_if_dirty # See if we have a new cur value if #{field_cache} v = #{field_cache} v_enc = cerealize_encode(:#{property}, v) # See if no pre at all (i.e. it was written to before being read), # or if different. When comparing, compare both marshalized string, # and Object ==. # if !#{field_orig} || (v_enc != #{field_orig} && v != cerealize_decode(:#{property}, #{field_orig})) self[:#{property}] = v_enc end end self.#{field_orig} = nil self.#{field_cache} = nil end, __FILE__, __LINE__ + 1
108:
109: before_save("#{property}_update_if_dirty")
110: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.