Module: Persistence::Object::Autodetermine

Included in:
Persistence, Persistence::Object
Defined in:
lib/persistence/object/autodetermine.rb

Overview

Module used internally to extend Persistence and Persistence::Object to automatically determine what type of object

(of types: Complex, Flat, Hash, Array, File) module is being included in, and to include the appropriate
corresponding module branch.

Class Method Summary collapse

Class Method Details

.extended(persistence_object_module) ⇒ Object

self.extended #



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/persistence/object/autodetermine.rb', line 15

def self.extended( persistence_object_module )

  persistence_object_module.extend( ::Module::Cluster )
  
  persistence_object_module.cluster( :persistence ).after_include do |class_or_module|

    # two types of objects: complex and flat
    # * complex objects persist ivars
    # * flat objects persist themselves (no ivars)
    #
    # if you want a different result, use the appropriate module directly
    # * ::Persistence::Complex
    # * ::Persistence::Flat

    # if we have a flat object, extend for flat object
    if class_or_module <= ::Array
      
      class_or_module.module_eval do
        include ::Persistence::Object::Complex::Array
      end
      
    elsif class_or_module <= ::Hash
      
      class_or_module.module_eval do
        include ::Persistence::Object::Complex::Hash
      end
      
    elsif  class_or_module <= ::Bignum      or
           class_or_module <= ::Fixnum      or
           class_or_module <= ::Complex     or
           class_or_module <= ::Rational    or
           class_or_module <= ::TrueClass   or
           class_or_module <= ::FalseClass  or
           class_or_module <= ::String      or
           class_or_module <= ::Symbol      or
           class_or_module <= ::Regexp      or
           class_or_module <= ::File        or
           class_or_module <= ::NilClass

      class_or_module.module_eval do
        include ::Persistence::Object::Flat
      end

    # otherwise extend as a complex object
    else

      class_or_module.module_eval do
        include ::Persistence::Object::Complex
      end

    end

  end

  persistence_object_module.cluster( :persistence ).before_extend( :class, :module ) do
    raise 'Persistence does not expect to be used without class-level support.'
  end
  
end