cerealize 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/CHANGES +21 -2
  2. data/{README → README.rdoc} +19 -17
  3. data/Rakefile +4 -2
  4. data/TODO +13 -3
  5. data/bench/simple.png +0 -0
  6. data/bench/simple.rb +99 -0
  7. data/cerealize.gemspec +53 -0
  8. data/lib/cerealize.rb +94 -54
  9. data/lib/cerealize/version.rb +1 -1
  10. data/slide/2010-04-24-cerealize.key/Contents/PkgInfo +1 -0
  11. data/slide/2010-04-24-cerealize.key/QuickLook/Thumbnail.jpg +0 -0
  12. data/slide/2010-04-24-cerealize.key/background.png +0 -0
  13. data/slide/2010-04-24-cerealize.key/cardinal-blue-black_200.png +0 -0
  14. data/slide/2010-04-24-cerealize.key/cereal-box.png +0 -0
  15. data/slide/2010-04-24-cerealize.key/color-profile +0 -0
  16. data/slide/2010-04-24-cerealize.key/index.apxl.gz +0 -0
  17. data/slide/2010-04-24-cerealize.key/simple.png +0 -0
  18. data/slide/2010-04-24-cerealize.key/thumbs/st0-11.tiff +0 -0
  19. data/slide/2010-04-24-cerealize.key/thumbs/st0-16.tiff +0 -0
  20. data/slide/2010-04-24-cerealize.key/thumbs/st0-19.tiff +0 -0
  21. data/slide/2010-04-24-cerealize.key/thumbs/st0-2.tiff +0 -0
  22. data/slide/2010-04-24-cerealize.key/thumbs/st0-22.tiff +0 -0
  23. data/slide/2010-04-24-cerealize.key/thumbs/st0-27.tiff +0 -0
  24. data/slide/2010-04-24-cerealize.key/thumbs/st0-29.tiff +0 -0
  25. data/slide/2010-04-24-cerealize.key/thumbs/st0-30.tiff +0 -0
  26. data/slide/2010-04-24-cerealize.key/thumbs/st0-32.tiff +0 -0
  27. data/slide/2010-04-24-cerealize.key/thumbs/st0-34.tiff +0 -0
  28. data/slide/2010-04-24-cerealize.key/thumbs/st0-38.tiff +0 -0
  29. data/slide/2010-04-24-cerealize.key/thumbs/st0-40.tiff +0 -0
  30. data/slide/2010-04-24-cerealize.key/thumbs/st0-46.tiff +0 -0
  31. data/slide/2010-04-24-cerealize.key/thumbs/st0-50.tiff +0 -0
  32. data/slide/2010-04-24-cerealize.key/thumbs/st0-51.tiff +0 -0
  33. data/slide/2010-04-24-cerealize.key/thumbs/st0-52.tiff +0 -0
  34. data/slide/2010-04-24-cerealize.key/thumbs/st0-54.tiff +0 -0
  35. data/slide/2010-04-24-cerealize.key/thumbs/st0-7.tiff +0 -0
  36. data/slide/2010-04-24-cerealize.key/thumbs/st0.tiff +0 -0
  37. data/slide/2010-04-24-cerealize.pdf +0 -0
  38. data/slide/cereal-box.ai +1619 -8
  39. data/slide/cereal-box.jpg +0 -0
  40. data/slide/cereal-box.png +0 -0
  41. data/test/helper.rb +3 -1
  42. data/test/helper_active_record.rb +16 -1
  43. data/test/test_basic.rb +35 -0
  44. metadata +104 -12
data/CHANGES CHANGED
@@ -1,4 +1,23 @@
1
1
  = cerealize changes history
2
2
 
3
- === cerealize 0.8.0, 2010-04-18
4
- * release early, release often
3
+ == cerealize 0.8.1 -- 2010-07-16
4
+ * module_eval is a lot faster than define_method with a block,
5
+ I think it's all about closure.
6
+
7
+ * Now we're creating cerealize methods inside a saperate,
8
+ this makes it easier to override things, thus doing extension.
9
+ An example:
10
+
11
+ class Dog < ActiveRecord::Base
12
+ include Cerealize
13
+
14
+ cerealize :mood, String
15
+ def mood
16
+ "mood: #{super}"
17
+ end
18
+ end
19
+
20
+ Previously, this would break things. (Please avoid alias_method_chain.)
21
+
22
+ == cerealize 0.8.0 -- 2010-04-18
23
+ * release early, release often
@@ -1,32 +1,34 @@
1
- = cerealize 0.8.0
1
+ = cerealize 0.8.1
2
2
  by Cardinal Blue ( http://cardinalblue.com )
3
3
 
4
4
  == LINKS:
5
5
 
6
- * github[http://github.com/cardinalblue/cerealize]
7
- * rubygems[http://rubygems.org/gems/cerealize]
6
+ * {github}[http://github.com/cardinalblue/cerealize]
7
+ * {rubygems}[http://rubygems.org/gems/cerealize]
8
+ * {rdoc}[http://rdoc.info/projects/cardinalblue/cerealize]
8
9
 
9
10
  == DESCRIPTION:
10
11
 
11
- Serialize out of the Cerealize Box
12
- - a drop-in replacement for ActiveRecord's serialize
12
+ Serialize out of the Cerealize Box
13
+ - a drop-in replacement for ActiveRecord's serialize
13
14
 
14
- It can auto transcode old encoding (yaml if you're using AR's serialize),
15
- to new encoding (marshal, json, you name it) without any migration.
15
+ It can auto transcode old encoding (yaml if you're using AR's serialize),
16
+ to new encoding (marshal, json, you name it) without any migration.
16
17
 
17
- Current supported encoding:
18
- 1. YAML
19
- 2. Marshal
20
- 3. JSON (planned)
18
+ Current supported encoding:
19
+ 1. YAML
20
+ 2. Marshal
21
+ 3. JSON (planned)
21
22
 
22
- Current supported ORM:
23
- 1. ActiveRecord (tested with 2.3.5)
24
- 2. DataMapper (planned)
23
+ Current supported ORM:
24
+ 1. ActiveRecord (tested with 2.3.5)
25
+ 2. DataMapper (planned)
25
26
 
26
27
  == SYNOPSIS:
27
28
 
28
29
  require 'cerealize'
29
30
  class User < ActiveRecord::Base
31
+ include Cerealize
30
32
  # when force_encoding set to false (this is default), cerealize is
31
33
  # smart enough to transcode old encoding (e.g. yaml) to new encoding
32
34
  # (i.e. marshal)
@@ -40,9 +42,9 @@ by Cardinal Blue ( http://cardinalblue.com )
40
42
 
41
43
  == INSTALL:
42
44
 
43
- > gem install cerealize
44
- or
45
- > script/plugin install git://github.com/cardinalblue/cerealize.git
45
+ > gem install cerealize
46
+ # or if you want rails plugin and bleeding edge
47
+ > script/plugin install git://github.com/cardinalblue/cerealize.git
46
48
 
47
49
  == LICENSE:
48
50
 
data/Rakefile CHANGED
@@ -17,16 +17,18 @@ Bones{
17
17
 
18
18
  depend_on 'activerecord', :version => '>=2.3.5'
19
19
  # depend_on 'activerecord', :development => true, :version => '>=2.3.5'
20
+ depend_on 'sqlite3-ruby', :development => true
20
21
 
21
22
  name proj
22
23
  url "http://github.com/cardinalblue/#{proj}"
23
- authors 'Cardinal Blue'
24
+ authors ['Cardinal Blue', 'Lin Jen-Shin (aka godfat 真常)', 'Jaime Cham']
24
25
  email 'dev (XD) cardinalblue.com'
25
26
 
26
27
  history_file 'CHANGES'
27
- readme_file 'README'
28
+ readme_file 'README.rdoc'
28
29
  ignore_file '.gitignore'
29
30
  rdoc.include ['\w+']
31
+ rdoc.exclude ['test', 'doc', 'Rakefile']
30
32
  }
31
33
 
32
34
  CLEAN.include Dir['**/*.rbc']
data/TODO CHANGED
@@ -1,7 +1,17 @@
1
1
  = cerealize todo list
2
2
 
3
- * cleanup test cases... use proper way to setup encoding
4
- * extract options, instead of hardcoded into method closure (block)
3
+ = ?
4
+
5
+ * cleanup test cases...
6
+
7
+ = 1.1+
8
+
9
+ * json support
10
+
11
+ = 1.2+
12
+
5
13
  * extract base64 decorator, then we can use pure marshal
14
+
15
+ = 1.3+
16
+
6
17
  * datamapper support
7
- * json support
data/bench/simple.png ADDED
Binary file
data/bench/simple.rb ADDED
@@ -0,0 +1,99 @@
1
+
2
+ require 'benchmark'
3
+
4
+ require 'active_record'
5
+ require 'cerealize'
6
+
7
+ ActiveRecord::Base.establish_connection(
8
+ :adapter => 'sqlite3',
9
+ :database => ':memory:'
10
+ )
11
+
12
+ [:hats, :cats].each{ |table|
13
+ ActiveRecord::Base.connection.create_table table, :force => true do |t|
14
+ t.text :box
15
+ end
16
+ }
17
+
18
+ class Hat < ActiveRecord::Base
19
+ serialize :box, Hash
20
+ end
21
+
22
+ class Cat < ActiveRecord::Base
23
+ include Cerealize
24
+ cerealize :box, Hash
25
+ end
26
+
27
+ def simple klass
28
+ box = Hash[(0..300).zip(301..600)]
29
+ mox = box.invert
30
+ klass.find(klass.create(:box => box).id).
31
+ update_attributes(:box => mox)
32
+ end
33
+
34
+ Times = 100
35
+
36
+ Benchmark.bmbm{ |bm|
37
+ bm.report('serialize (build in ActiveRecord)') do
38
+ Times.times{ simple(Hat) }
39
+ end
40
+
41
+ bm.report('cerealize') do
42
+ Times.times{ simple(Cat) }
43
+ end
44
+ }
45
+
46
+ __END__
47
+ > system_profiler -detailLevel mini | grep -A 15 'Hardware Overview:'
48
+ Hardware Overview:
49
+
50
+ Model Name: MacBook
51
+ Model Identifier: MacBook2,1
52
+ Processor Name: Intel Core 2 Duo
53
+ Processor Speed: 2.16 GHz
54
+ Number Of Processors: 1
55
+ Total Number Of Cores: 2
56
+ L2 Cache: 4 MB
57
+ Memory: 3 GB
58
+ Bus Speed: 667 MHz
59
+ Boot ROM Version: MB21.00A5.B07
60
+ SMC Version (system): 1.17f0
61
+ Sudden Motion Sensor:
62
+ State: Enabled
63
+
64
+ > uname -a
65
+ Darwin godfat.local 10.3.0 Darwin Kernel Version 10.3.0: Fri Feb 26 11:58:09 PST 2010; root:xnu-1504.3.12~1/RELEASE_I386 i386 i386
66
+
67
+ > ruby -v
68
+ ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10]
69
+
70
+
71
+
72
+
73
+
74
+ > ruby -I lib bench/simple.rb
75
+ Rehearsal ---------------------------------------------------------------------
76
+ serialize (build in ActiveRecord) 4.050000 0.080000 4.130000 ( 4.459223)
77
+ cerealize 0.810000 0.010000 0.820000 ( 1.119697)
78
+ ------------------------------------------------------------ total: 4.950000sec
79
+
80
+ user system total real
81
+ serialize (build in ActiveRecord) 3.870000 0.070000 3.940000 ( 4.299835)
82
+ cerealize 0.690000 0.010000 0.700000 ( 0.733006)
83
+
84
+
85
+
86
+
87
+
88
+ http://chart.apis.google.com/chart?cht=bvg&chs=350x650&chd=t:85.9967,14.66012&chxl=0:|serialize|cerealize&chxt=x,y&chbh=150&chxr=1,0,5&chma=25
89
+
90
+ http://code.google.com/apis/chart/docs/chart_playground.html
91
+
92
+ cht=bvg
93
+ chs=350x650
94
+ chd=t:85.9967,14.66012
95
+ chxl=0:|serialize|cerealize
96
+ chxt=x,y
97
+ chbh=150
98
+ chxr=1,0,5
99
+ chma=25
data/cerealize.gemspec ADDED
@@ -0,0 +1,53 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{cerealize}
5
+ s.version = "0.8.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Cardinal Blue", "Lin Jen-Shin (aka godfat 真常)", "Jaime Cham"]
9
+ s.date = %q{2010-07-16}
10
+ s.description = %q{ Serialize out of the Cerealize Box
11
+ - a drop-in replacement for ActiveRecord's serialize
12
+
13
+ It can auto transcode old encoding (yaml if you're using AR's serialize),
14
+ to new encoding (marshal, json, you name it) without any migration.
15
+
16
+ Current supported encoding:
17
+ 1. YAML
18
+ 2. Marshal
19
+ 3. JSON (planned)
20
+
21
+ Current supported ORM:
22
+ 1. ActiveRecord (tested with 2.3.5)
23
+ 2. DataMapper (planned)}
24
+ s.email = %q{dev (XD) cardinalblue.com}
25
+ s.extra_rdoc_files = ["CHANGES", "LICENSE", "TODO", "bench/simple.png", "cerealize.gemspec", "slide/2010-04-24-cerealize.key/Contents/PkgInfo", "slide/2010-04-24-cerealize.key/QuickLook/Thumbnail.jpg", "slide/2010-04-24-cerealize.key/background.png", "slide/2010-04-24-cerealize.key/cardinal-blue-black_200.png", "slide/2010-04-24-cerealize.key/cereal-box.png", "slide/2010-04-24-cerealize.key/color-profile", "slide/2010-04-24-cerealize.key/index.apxl.gz", "slide/2010-04-24-cerealize.key/simple.png", "slide/2010-04-24-cerealize.key/thumbs/st0-11.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-16.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-19.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-2.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-22.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-27.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-29.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-30.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-32.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-34.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-38.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-40.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-46.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-50.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-51.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-52.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-54.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-7.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0.tiff", "slide/2010-04-24-cerealize.pdf", "slide/cereal-box.ai", "slide/cereal-box.jpg", "slide/cereal-box.png"]
26
+ s.files = ["CHANGES", "LICENSE", "README.rdoc", "Rakefile", "TODO", "bench/simple.png", "bench/simple.rb", "cerealize.gemspec", "init.rb", "lib/cerealize.rb", "lib/cerealize/codec/marshal.rb", "lib/cerealize/codec/yaml.rb", "lib/cerealize/version.rb", "slide/2010-04-24-cerealize.key/Contents/PkgInfo", "slide/2010-04-24-cerealize.key/QuickLook/Thumbnail.jpg", "slide/2010-04-24-cerealize.key/background.png", "slide/2010-04-24-cerealize.key/cardinal-blue-black_200.png", "slide/2010-04-24-cerealize.key/cereal-box.png", "slide/2010-04-24-cerealize.key/color-profile", "slide/2010-04-24-cerealize.key/index.apxl.gz", "slide/2010-04-24-cerealize.key/simple.png", "slide/2010-04-24-cerealize.key/thumbs/st0-11.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-16.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-19.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-2.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-22.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-27.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-29.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-30.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-32.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-34.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-38.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-40.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-46.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-50.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-51.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-52.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-54.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0-7.tiff", "slide/2010-04-24-cerealize.key/thumbs/st0.tiff", "slide/2010-04-24-cerealize.pdf", "slide/cereal-box.ai", "slide/cereal-box.jpg", "slide/cereal-box.png", "test/helper.rb", "test/helper_active_record.rb", "test/stub.rb", "test/test_all_codec.rb", "test/test_basic.rb", "test/test_transcode.rb"]
27
+ s.homepage = %q{http://github.com/cardinalblue/cerealize}
28
+ s.rdoc_options = ["--main", "README.rdoc"]
29
+ s.require_paths = ["lib"]
30
+ s.rubyforge_project = %q{cerealize}
31
+ s.rubygems_version = %q{1.3.7}
32
+ s.summary = %q{Serialize out of the Cerealize Box - a drop-in replacement for ActiveRecord's serialize It can auto transcode old encoding (yaml if you're using AR's serialize), to new encoding (marshal, json, you name it) without any migration}
33
+ s.test_files = ["test/test_all_codec.rb", "test/test_basic.rb", "test/test_transcode.rb"]
34
+
35
+ if s.respond_to? :specification_version then
36
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
37
+ s.specification_version = 3
38
+
39
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
40
+ s.add_runtime_dependency(%q<activerecord>, [">= 2.3.5"])
41
+ s.add_development_dependency(%q<sqlite3-ruby>, [">= 1.3.1"])
42
+ s.add_development_dependency(%q<bones>, [">= 3.4.7"])
43
+ else
44
+ s.add_dependency(%q<activerecord>, [">= 2.3.5"])
45
+ s.add_dependency(%q<sqlite3-ruby>, [">= 1.3.1"])
46
+ s.add_dependency(%q<bones>, [">= 3.4.7"])
47
+ end
48
+ else
49
+ s.add_dependency(%q<activerecord>, [">= 2.3.5"])
50
+ s.add_dependency(%q<sqlite3-ruby>, [">= 1.3.1"])
51
+ s.add_dependency(%q<bones>, [">= 3.4.7"])
52
+ end
53
+ end
data/lib/cerealize.rb CHANGED
@@ -17,20 +17,19 @@ module Cerealize
17
17
  #
18
18
 
19
19
  def self.included(base)
20
- base.send :extend, ClassMethods
20
+ base.send( :extend, ClassMethods)
21
+ base.send(:include, InstanceMethods)
21
22
  end
22
23
 
23
24
  module_function
24
25
  def codecs
25
- @codecs ||= Codec.constants.sort.map{ |codec_name|
26
- Codec.const_get(codec_name)
26
+ @codecs ||= codec_names.map{ |codec_name|
27
+ codec_get(codec_name)
27
28
  }
28
29
  end
29
30
 
30
31
  def codec_names
31
- @codec_names ||= codecs.map{ |codec|
32
- codec.to_s.sub(/(\w+::)+/, '').downcase.to_sym
33
- }
32
+ @codec_names ||= [:yaml, :marshal]
34
33
  end
35
34
 
36
35
  def codec_detect(str)
@@ -59,13 +58,56 @@ module Cerealize
59
58
  end
60
59
  end
61
60
 
61
+ module InstanceMethods
62
+ def cerealize_decode property, value
63
+ opt = self.class.cerealize_option[property]
64
+ Cerealize.decode( value, opt[:force_encoding] && opt[:codec] )
65
+ end
66
+
67
+ def cerealize_encode property, value
68
+ opt = self.class.cerealize_option[property]
69
+ Cerealize.encode( value, opt[:codec] )
70
+ end
71
+ end
72
+
62
73
  module ClassMethods
74
+ def cerealize_option
75
+ @cerealize_option ||= {}
76
+ end
63
77
 
64
- def cerealize property, klass=nil, options={}
65
- field_pre = "@#{property}_pre".to_sym
66
- field_cache = "@#{property}".to_sym
67
- codec = Cerealize.codec_get(options[:encoding] || :marshal)
68
- force_encoding = options[:force_encoding]
78
+ def cerealize_update_codec_cache
79
+ cerealize_option.each{ |(property, opt)|
80
+ opt.merge!(:codec => Cerealize.codec_get(opt[:encoding]))
81
+ }
82
+ end
83
+
84
+ def cerealize property, klass=nil, opt={}
85
+ opt[:encoding] ||= :marshal
86
+ cerealize_option[property] =
87
+ opt.merge(:class => klass,
88
+ :codec => Cerealize.codec_get(opt[:encoding]))
89
+
90
+ field_orig = "#{property}_orig"
91
+ field_cache = "#{property}_cache"
92
+
93
+ attr_accessor field_orig
94
+ private field_orig, "#{field_orig}="
95
+
96
+ mod = if const_defined?('CerealizeMethods')
97
+ const_get('CerealizeMethods')
98
+ else
99
+ const_set('CerealizeMethods', Module.new)
100
+ end
101
+
102
+ mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
103
+ def #{field_cache}
104
+ @#{property}
105
+ end
106
+
107
+ def #{field_cache}=(new_value)
108
+ @#{property} = new_value
109
+ end
110
+ RUBY
69
111
 
70
112
  # Invariants:
71
113
  # - instance_variable_defined?(field_cache) IFF the READER or WRITER has been called
@@ -74,61 +116,59 @@ module Cerealize
74
116
 
75
117
  # READER method
76
118
  #
77
- define_method property do
78
- # Rails.logger.debug "#{property} (READER)"
119
+ mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
120
+ def #{property}
121
+ # Return cached
122
+ return #{field_cache} if #{field_cache}
79
123
 
80
- # See if no assignment yet
81
- if !instance_variable_defined?(field_cache)
82
-
83
- # Save property if not already saved
84
- if !instance_variable_defined?(field_pre)
85
- instance_variable_set(field_pre, read_attribute(property))
86
- end
124
+ # No assignment yet, save property if not already saved
125
+ self.#{field_orig}= self[:#{property}] if !#{field_orig}
87
126
 
88
127
  # Set cached from pre
89
- v = Cerealize.decode(instance_variable_get(field_pre),
90
- force_encoding && codec )
91
- raise ActiveRecord::SerializationTypeMismatch, "expected #{klass}, got #{v.class}" \
92
- if klass && !v.nil? && !v.kind_of?(klass)
93
- instance_variable_set(field_cache, v)
94
- end
128
+ value = cerealize_decode(:#{property}, #{field_orig})
95
129
 
96
- # Return cached
97
- instance_variable_get(field_cache)
98
- end
130
+ raise ActiveRecord::SerializationTypeMismatch, "expected #{klass}, got \#{value.class}" \\
131
+ if #{klass.inspect} && !value.nil? && !value.kind_of?(#{klass})
132
+
133
+ self.#{field_cache} = value
134
+ end
135
+ RUBY
99
136
 
100
137
  # WRITER method
101
138
  #
102
- define_method "#{property}=" do |v|
103
- # Rails.logger.debug "#{property}=#{v}"
104
- send "#{property}_will_change!" if instance_variable_get(field_cache) != v
105
- instance_variable_set(field_cache, v)
106
- end
139
+ mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
140
+ def #{property}=(value)
141
+ #{property}_will_change! if #{field_cache} != value
142
+ self.#{field_cache} = value
143
+ end
144
+ RUBY
107
145
 
108
146
  # Callback for before_save
109
147
  #
110
- define_method "#{property}_update_if_dirty" do
111
- # Rails.logger.debug "#{property}_update_if_dirty"
112
-
113
- # See if we have a new cur value
114
- if instance_variable_defined?(field_cache)
115
- v = instance_variable_get(field_cache)
116
- v_enc = Cerealize.encode(v, codec)
117
-
118
- # See if no pre at all (i.e. it was written to before being read),
119
- # or if different. When comparing, compare both marshalized string,
120
- # and Object ==.
121
- #
122
- if !instance_variable_defined?(field_pre) ||
123
- (v_enc != instance_variable_get(field_pre) &&
124
- v != Cerealize.decode(instance_variable_get(field_pre),
125
- force_encoding && codec ))
126
- write_attribute(property, v_enc)
148
+ mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
149
+ def #{property}_update_if_dirty
150
+ # See if we have a new cur value
151
+ if #{field_cache}
152
+ value = #{field_cache}
153
+ value_enc = cerealize_encode(:#{property}, value)
154
+
155
+ # See if no orig at all (i.e. it was written to before
156
+ # being read), or if different. When comparing, compare
157
+ # both marshalized string, and Object ==.
158
+ #
159
+ if !#{field_orig} ||
160
+ (value_enc != #{field_orig} &&
161
+ value != cerealize_decode(:#{property}, #{field_orig}))
162
+ self[:#{property}] = value_enc
163
+ end
127
164
  end
165
+
166
+ self.#{field_orig} = nil
167
+ self.#{field_cache} = nil
128
168
  end
129
- remove_instance_variable(field_pre) if instance_variable_defined?(field_pre)
130
- remove_instance_variable(field_cache) if instance_variable_defined?(field_cache)
131
- end
169
+ RUBY
170
+
171
+ include mod unless self < mod
132
172
  before_save("#{property}_update_if_dirty")
133
173
  end
134
174
  end