cerealize 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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