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
# File 'lib/redis_object/types.rb', line 137

def intercept_for_typing!
	return if @intercepted_for_typing
	
	filter_gets do |obj, k, v|
		obj.enforce_format(k, v)
	end
	
	filter_sets do |obj, k, v|
		[k, obj.save_format(k,v)]
	end
	
	filter_msets do |obj, dat|
		dat.merge!(dat) {|k,v1,v2| obj.save_format(k, v1) }
	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