Module: Seabright::Types::ClassMethods

Defined in:
lib/redis_object/types.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/redis_object/types.rb', line 50

def method_missing(sym,*args,&block)
  if als = Types.type_aliases[sym]
    org = sym
    sym = als
  end
  if Types.known_types.include?(sym)
    register_type(sym,org)
    send(sym,*args,&block)
  else
    super(sym,*args,&block)
  end
end

Instance Method Details

#describeObject



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/redis_object/types.rb', line 114

def describe
  all_keys.inject({}) do |acc,(k,v)|
    if field_formats[k.to_sym]
      acc[k.to_sym] ||= [field_formats[k.to_sym].to_s.gsub(/^format_/,'').to_sym, 0]
    else
      acc[k.to_sym] ||= [:string, 0]
    end
    acc[k.to_sym][1] += 1
    acc
  end
end

#dump_schema(file) ⇒ Object



126
127
128
129
130
131
132
133
134
135
# File 'lib/redis_object/types.rb', line 126

def dump_schema(file)
  child_classes_set.sort {|a,b| a.name <=> b.name}.each do |child|
    file.puts "# #{child.name}"
    # sort fields by number of instances found
    child.describe.sort {|a,b| b[1][1] <=> a[1][1]}.each do |field,(type, count)|
      file.puts "#{field}: #{type} (#{count})"
    end
    file.puts
  end
end

#field_formatsObject



81
82
83
# File 'lib/redis_object/types.rb', line 81

def field_formats
  @field_formats_hash ||= (defined?(superclass.field_formats) ? superclass.field_formats.clone : {})
end

#field_formats_set_locallyObject



92
93
94
# File 'lib/redis_object/types.rb', line 92

def field_formats_set_locally
  @field_formats_set_locally_set ||= Set.new
end

#inherit_field_format(k, v) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/redis_object/types.rb', line 96

def inherit_field_format(k, v)
  unless fields_formats_set_locally.include? k
    field_formats[k] = v
    update_child_class_field_formats(k, v)
  end
  intercept_for_typing!
end

#intercept_for_typing!Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/redis_object/types.rb', line 137

def intercept_for_typing!
  return if @intercepted_for_typing
  self.class_eval do
    
    alias_method :untyped_get, :get unless method_defined?(:untyped_get)
    def get(k)
      enforce_format(k,untyped_get(k))
    end
    
    alias_method :untyped_mset, :mset unless method_defined?(:untyped_mset)
    def mset(dat)
      dat.merge!(dat) {|k,v1,v2| save_format(k,v1) }
      untyped_mset(dat)
    end
    
    alias_method :untyped_set, :set unless method_defined?(:untyped_set)
    def set(k,v)
      untyped_set(k,save_format(k,v))
    end
    
    alias_method :untyped_setnx, :setnx unless method_defined?(:untyped_setnx)
    def setnx(k,v)
      untyped_setnx(k,save_format(k,v))
    end
    
  end
  @intercepted_for_typing = true
end

#register_format(k, fmt) ⇒ Object



110
111
112
# File 'lib/redis_object/types.rb', line 110

def register_format(k,fmt)
  send(fmt, k)
end

#register_type(sym, als = nil) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/redis_object/types.rb', line 63

def register_type(sym,als=nil)
  sym = sym.to_sym
  return if self.respond_to?(sym)
  self.send(:include,Types.const_get("#{sym.to_s.capitalize}Type".to_sym))
  metaclass = class << self; self; end
  metaclass.class_eval do
    define_method(sym) do |k|
      set_field_format k, sym
    end
    if als
      als = als.to_sym
      define_method(als) do |k|
        set_field_format k, sym
      end
    end
  end
end

#set_field_format(k, v) ⇒ Object



85
86
87
88
89
90
# File 'lib/redis_object/types.rb', line 85

def set_field_format(k, v)
  field_formats_set_locally.add(k)
  field_formats[k] = v
  update_child_class_field_formats(k, v)
  intercept_for_typing!
end

#update_child_class_field_formats(k, v) ⇒ Object



104
105
106
107
108
# File 'lib/redis_object/types.rb', line 104

def update_child_class_field_formats(k, v)
  child_classes.each do |child_class|
    child_class.inherit_field_format(k, v)
  end
end