redis_object 0.5.0 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -2
- data/Gemfile +0 -4
- data/README.markdown +15 -24
- data/Rakefile +0 -8
- data/doc/Object.html +185 -0
- data/doc/Seabright.html +181 -0
- data/doc/Seabright/Adapter.html +442 -0
- data/doc/Seabright/Collection.html +797 -0
- data/doc/Seabright/Collections.html +635 -0
- data/doc/Seabright/Collections/ClassMethods.html +212 -0
- data/doc/Seabright/ExternalIndex.html +217 -0
- data/doc/Seabright/History.html +382 -0
- data/doc/Seabright/History/ClassMethods.html +276 -0
- data/doc/Seabright/Indices.html +324 -0
- data/doc/Seabright/Indices/ClassMethods.html +348 -0
- data/doc/Seabright/Keys.html +314 -0
- data/doc/Seabright/Keys/ClassMethods.html +276 -0
- data/doc/Seabright/ObjectBase.html +852 -0
- data/doc/Seabright/ObjectBase/ClassMethods.html +677 -0
- data/doc/Seabright/RedisObject.html +230 -0
- data/doc/Seabright/References.html +280 -0
- data/doc/Seabright/Storage.html +252 -0
- data/doc/Seabright/Storage/ClassMethods.html +276 -0
- data/doc/Seabright/Storage/MySQL.html +442 -0
- data/doc/Seabright/Storage/Redis.html +218 -0
- data/doc/Seabright/Template.html +212 -0
- data/doc/Seabright/Template/ClassMethods.html +166 -0
- data/doc/Seabright/Timestamps.html +292 -0
- data/doc/Seabright/Timestamps/ClassMethods.html +214 -0
- data/doc/Seabright/Types.html +410 -0
- data/doc/Seabright/Types/ClassMethods.html +308 -0
- data/doc/created.rid +17 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +125 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +394 -0
- data/lib/redis_object.rb +1 -11
- data/lib/redis_object/base.rb +60 -210
- data/lib/redis_object/collection.rb +100 -130
- data/lib/redis_object/defaults.rb +8 -21
- data/lib/redis_object/ext/filters.rb +16 -34
- data/lib/redis_object/ext/triggers.rb +13 -75
- data/lib/redis_object/{experimental/history.rb → history.rb} +0 -0
- data/lib/redis_object/indices.rb +39 -44
- data/lib/redis_object/keys.rb +4 -4
- data/lib/redis_object/storage.rb +1 -30
- data/lib/redis_object/storage/adapter.rb +3 -6
- data/lib/redis_object/storage/redis.rb +3 -98
- data/lib/redis_object/timestamps.rb +21 -42
- data/lib/redis_object/types.rb +30 -172
- data/lib/redis_object/version.rb +1 -1
- data/redis_object.gemspec +0 -1
- data/spec/base_spec.rb +6 -41
- data/spec/spec_helper.rb +1 -32
- metadata +116 -111
- data/.coveralls.yml +0 -1
- data/.travis.yml +0 -5
- data/lib/redis_object/ext/script_cache.rb +0 -92
- data/lib/redis_object/ext/shardable.rb +0 -18
- data/lib/redis_object/ext/view_caching.rb +0 -258
- data/lib/redis_object/ext/views.rb +0 -102
- data/lib/redis_object/inheritance_tracking.rb +0 -23
- data/spec/adapter_spec.rb +0 -43
- data/spec/benchmark_spec.rb +0 -46
- data/spec/collections_spec.rb +0 -144
- data/spec/defaults_spec.rb +0 -56
- data/spec/filters_spec.rb +0 -29
- data/spec/indices_spec.rb +0 -45
- data/spec/rename_class_spec.rb +0 -96
- data/spec/timestamp_spec.rb +0 -28
- data/spec/trigger_spec.rb +0 -51
- data/spec/types_spec.rb +0 -103
- data/spec/view_caching_spec.rb +0 -130
- data/spec/views_spec.rb +0 -72
@@ -2,6 +2,20 @@ module Seabright
|
|
2
2
|
|
3
3
|
module Collections
|
4
4
|
|
5
|
+
def dump
|
6
|
+
require "utf8_utils"
|
7
|
+
out = ["puts \"Creating: #{id}\""]
|
8
|
+
s_id = id.gsub(/\W/,"_")
|
9
|
+
out << "a#{s_id} = #{self.class.cname}.new(#{actual.to_s.tidy_bytes})"
|
10
|
+
collections.each do |col|
|
11
|
+
col.each do |sobj|
|
12
|
+
out << sobj.dump(self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
out << "a#{s_id}.save"
|
16
|
+
out.join("\n")
|
17
|
+
end
|
18
|
+
|
5
19
|
def hkey_col(ident = nil)
|
6
20
|
"#{hkey}:collections"
|
7
21
|
end
|
@@ -10,24 +24,49 @@ module Seabright
|
|
10
24
|
super(o_id)
|
11
25
|
store.smembers(hkey_col).each do |name|
|
12
26
|
collections[name] = Seabright::Collection.load(name,self)
|
13
|
-
define_access(name) do
|
14
|
-
get_collection(name)
|
15
|
-
end
|
16
|
-
define_access(name.to_s.singularize) do
|
17
|
-
get_collection(name).latest
|
18
|
-
end
|
19
27
|
end
|
28
|
+
# TODO: Here's an example of dynamic method creation - should do this instead of method_missing + module intercepts...
|
29
|
+
# %w[report alert error summary].each do |kind|
|
30
|
+
# class_eval <<-END
|
31
|
+
# if "#{kind}" == "summary"
|
32
|
+
# def summaries
|
33
|
+
# data_for_server[:summaries]
|
34
|
+
# end
|
35
|
+
# else
|
36
|
+
# def #{kind}s
|
37
|
+
# data_for_server[:#{kind}s]
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# if "#{kind}" == "report"
|
42
|
+
# def report(new_entry)
|
43
|
+
# reports << new_entry
|
44
|
+
# end
|
45
|
+
# elsif "#{kind}" == "summary"
|
46
|
+
# def summary(new_entry)
|
47
|
+
# summaries << new_entry
|
48
|
+
# end
|
49
|
+
# else
|
50
|
+
# def #{kind}(*fields)
|
51
|
+
# #{kind}s << ( fields.first.is_a?(Hash) ?
|
52
|
+
# fields.first :
|
53
|
+
# {:subject => fields.first, :body => fields.last} )
|
54
|
+
# end
|
55
|
+
# end
|
56
|
+
# alias_method :add_#{kind}, :#{kind}
|
57
|
+
# END
|
58
|
+
# end
|
20
59
|
true
|
21
60
|
end
|
22
61
|
|
23
62
|
def delete_child(obj)
|
24
|
-
if col =
|
25
|
-
col.delete obj
|
63
|
+
if col = collections[obj.collection_name]
|
64
|
+
col.delete obj.hkey
|
26
65
|
end
|
27
66
|
end
|
28
67
|
|
29
68
|
def collection_name
|
30
|
-
self.class.
|
69
|
+
self.class.plname.underscore.to_sym
|
31
70
|
end
|
32
71
|
|
33
72
|
def ref_key(ident = nil)
|
@@ -35,18 +74,14 @@ module Seabright
|
|
35
74
|
end
|
36
75
|
|
37
76
|
def reference(obj)
|
38
|
-
|
39
|
-
|
77
|
+
name = obj.collection_name
|
78
|
+
store.sadd hkey_col, name
|
79
|
+
collections[name.to_s] ||= Seabright::Collection.load(name,self)
|
80
|
+
collections[name.to_s] << obj.hkey
|
40
81
|
obj.referenced_by self
|
41
82
|
end
|
42
|
-
|
43
|
-
|
44
|
-
reference obj
|
45
|
-
end
|
46
|
-
|
47
|
-
def push(obj)
|
48
|
-
reference obj
|
49
|
-
end
|
83
|
+
alias_method :<<, :reference
|
84
|
+
alias_method :push, :reference
|
50
85
|
|
51
86
|
def remove_collection!(name)
|
52
87
|
store.srem hkey_col, name
|
@@ -89,23 +124,11 @@ module Seabright
|
|
89
124
|
end
|
90
125
|
|
91
126
|
def has_collection?(name)
|
92
|
-
|
127
|
+
store.sismember(hkey_col,name.to_s)
|
93
128
|
end
|
94
129
|
|
95
130
|
def get_collection(name)
|
96
|
-
|
97
|
-
collections[name.to_s] ||= Collection.load(name,self)
|
98
|
-
else
|
99
|
-
store.sadd hkey_col, name
|
100
|
-
@collection_names << name.to_s
|
101
|
-
collections[name.to_s] ||= Collection.load(name,self)
|
102
|
-
define_access(name.to_s.pluralize) do
|
103
|
-
get_collection(name)
|
104
|
-
end
|
105
|
-
define_access(name.to_s.singularize) do
|
106
|
-
get_collection(name).latest
|
107
|
-
end
|
108
|
-
end
|
131
|
+
collections[name.to_s] ||= Collection.load(name,self)
|
109
132
|
collections[name.to_s]
|
110
133
|
end
|
111
134
|
|
@@ -113,77 +136,22 @@ module Seabright
|
|
113
136
|
@collections ||= {}
|
114
137
|
end
|
115
138
|
|
116
|
-
def collection_names
|
117
|
-
@collection_names ||= store.smembers(hkey_col)
|
118
|
-
end
|
119
|
-
|
120
139
|
def mset(dat)
|
121
140
|
dat.select! {|k,v| !collections[k.to_s] }
|
122
141
|
super(dat)
|
123
142
|
end
|
124
143
|
|
125
144
|
def set(k,v)
|
126
|
-
@data ? super(k,v) :
|
145
|
+
@data ? super(k,v) : collections[k.to_s] ? get_collection(k.to_s).replace(v) : super(k,v)
|
127
146
|
v
|
128
147
|
end
|
129
148
|
|
130
149
|
module ClassMethods
|
131
150
|
|
132
|
-
def hkey_col(ident =
|
151
|
+
def hkey_col(ident = id)
|
133
152
|
"#{hkey(ident)}:collections"
|
134
153
|
end
|
135
154
|
|
136
|
-
def delete_child(obj)
|
137
|
-
if col = get_collection(obj.collection_name)
|
138
|
-
col.delete obj
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def collection_name
|
143
|
-
self.name.split('::').last.pluralize.underscore.to_sym
|
144
|
-
end
|
145
|
-
|
146
|
-
def reference(obj)
|
147
|
-
name = obj.collection_name
|
148
|
-
store.sadd hkey_col, name
|
149
|
-
get_collection(name) << obj.hkey
|
150
|
-
end
|
151
|
-
|
152
|
-
def <<(obj)
|
153
|
-
reference obj
|
154
|
-
end
|
155
|
-
|
156
|
-
def push(obj)
|
157
|
-
reference obj
|
158
|
-
end
|
159
|
-
|
160
|
-
def remove_collection!(name)
|
161
|
-
store.srem hkey_col, name
|
162
|
-
end
|
163
|
-
|
164
|
-
def get(k)
|
165
|
-
if has_collection?(k)
|
166
|
-
get_collection(k)
|
167
|
-
elsif has_collection?(pk = k.to_s.pluralize)
|
168
|
-
get_collection(pk).first
|
169
|
-
else
|
170
|
-
super(k)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def has_collection?(name)
|
175
|
-
store.sismember(hkey_col,name.to_s)
|
176
|
-
end
|
177
|
-
|
178
|
-
def get_collection(name)
|
179
|
-
collections[name.to_s] ||= Collection.load(name,self)
|
180
|
-
collections[name.to_s]
|
181
|
-
end
|
182
|
-
|
183
|
-
def collections
|
184
|
-
@collections ||= {}
|
185
|
-
end
|
186
|
-
|
187
155
|
end
|
188
156
|
|
189
157
|
def self.included(base)
|
@@ -194,26 +162,24 @@ module Seabright
|
|
194
162
|
|
195
163
|
class Collection < Array
|
196
164
|
|
197
|
-
|
198
|
-
|
199
|
-
def initialize(name,owner)
|
165
|
+
def initialize(name,parent)
|
200
166
|
@name = name.to_s
|
201
|
-
@
|
167
|
+
@parent = parent
|
202
168
|
end
|
203
169
|
|
204
170
|
def remove!
|
205
|
-
@
|
171
|
+
@parent.remove_collection! @name
|
206
172
|
end
|
207
173
|
|
208
174
|
def latest
|
209
|
-
indexed(:created_at,5,true).first
|
175
|
+
indexed(:created_at,5,true).first
|
210
176
|
end
|
211
177
|
|
212
178
|
def indexed(idx,num=-1,reverse=false)
|
213
179
|
keys = keys_by_index(idx,num,reverse)
|
214
180
|
out = Enumerator.new do |y|
|
215
181
|
keys.each do |member|
|
216
|
-
if a =
|
182
|
+
if a = RedisObject.find_by_key(member)
|
217
183
|
y << a
|
218
184
|
end
|
219
185
|
end
|
@@ -228,16 +194,18 @@ module Seabright
|
|
228
194
|
end
|
229
195
|
|
230
196
|
def temp_key
|
231
|
-
"
|
197
|
+
"zintersect_temp"
|
232
198
|
end
|
233
199
|
|
234
|
-
RedisObject::ScriptSources::FwdScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze
|
235
|
-
RedisObject::ScriptSources::RevScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZREVRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze
|
236
|
-
|
237
200
|
def keys_by_index(idx,num=-1,reverse=false)
|
238
|
-
keys =
|
201
|
+
keys = nil
|
202
|
+
store.multi do
|
203
|
+
store.zinterstore(temp_key, [index_key(idx), key], {:weights => ["1","0"]})
|
204
|
+
keys = store.send(reverse ? :zrevrange : :zrange, temp_key, 0, num)
|
205
|
+
store.del temp_key
|
206
|
+
end
|
239
207
|
Enumerator.new do |y|
|
240
|
-
keys.each do |member|
|
208
|
+
keys.value.each do |member|
|
241
209
|
y << member
|
242
210
|
end
|
243
211
|
end
|
@@ -256,15 +224,12 @@ module Seabright
|
|
256
224
|
return real_at(item_key(k))
|
257
225
|
elsif k.is_a? Hash
|
258
226
|
return match(k)
|
259
|
-
elsif k.is_a?
|
227
|
+
elsif k.is_a? Number
|
260
228
|
return real_at(at(k))
|
261
229
|
end
|
262
230
|
return nil
|
263
231
|
end
|
264
|
-
|
265
|
-
def [](k)
|
266
|
-
find k
|
267
|
-
end
|
232
|
+
alias_method :[], :find
|
268
233
|
|
269
234
|
def match(pkt)
|
270
235
|
Enumerator.new do |y|
|
@@ -277,25 +242,29 @@ module Seabright
|
|
277
242
|
end
|
278
243
|
|
279
244
|
def real_at(key)
|
280
|
-
|
245
|
+
RedisObject.find_by_key(key)
|
281
246
|
end
|
282
247
|
|
248
|
+
# def [](idx)
|
249
|
+
# class_const.find_by_key(at(idx))
|
250
|
+
# end
|
251
|
+
|
283
252
|
def objects
|
284
253
|
each.to_a
|
285
254
|
end
|
286
255
|
|
287
256
|
def first
|
288
|
-
|
257
|
+
RedisObject.find_by_key(super)
|
289
258
|
end
|
290
259
|
|
291
260
|
def last
|
292
|
-
|
261
|
+
RedisObject.find_by_key(super)
|
293
262
|
end
|
294
263
|
|
295
264
|
def each
|
296
265
|
out = Enumerator.new do |y|
|
297
266
|
each_index do |key|
|
298
|
-
if a =
|
267
|
+
if a = RedisObject.find_by_key(at(key))
|
299
268
|
y << a
|
300
269
|
end
|
301
270
|
end
|
@@ -311,7 +280,7 @@ module Seabright
|
|
311
280
|
|
312
281
|
def cleanup!
|
313
282
|
each_index do |key|
|
314
|
-
unless a =
|
283
|
+
unless a = RedisObject.find_by_key(at(key))
|
315
284
|
puts "Deleting #{key} because not #{a.inspect}" if DEBUG
|
316
285
|
delete at(key)
|
317
286
|
end
|
@@ -330,7 +299,7 @@ module Seabright
|
|
330
299
|
return nil unless block_given?
|
331
300
|
Enumerator.new do |y|
|
332
301
|
each_index do |key|
|
333
|
-
if (a =
|
302
|
+
if (a = RedisObject.find_by_key(at(key))) && block.call(a)
|
334
303
|
y << a
|
335
304
|
end
|
336
305
|
end
|
@@ -352,35 +321,36 @@ module Seabright
|
|
352
321
|
store.zadd(key,store.zcount(key,"-inf", "+inf"),k)
|
353
322
|
super(k)
|
354
323
|
end
|
355
|
-
|
356
|
-
def push(obj)
|
357
|
-
self << obj
|
358
|
-
end
|
324
|
+
alias_method :push, :<<
|
359
325
|
|
360
326
|
def class_const
|
361
|
-
|
362
|
-
end
|
363
|
-
|
364
|
-
def store
|
365
|
-
class_const.store
|
327
|
+
Object.const_get(@name.to_s.classify.to_sym)
|
366
328
|
end
|
367
329
|
|
368
330
|
def key
|
369
|
-
"#{@
|
331
|
+
"#{@parent ? "#{@parent.key}:" : ""}COLLECTION:#{@name}"
|
370
332
|
end
|
371
333
|
|
372
334
|
class << self
|
373
335
|
|
374
|
-
def load(name,
|
375
|
-
out = new(name,
|
376
|
-
out.replace
|
336
|
+
def load(name,parent)
|
337
|
+
out = new(name,parent)
|
338
|
+
out.replace store.zrange(out.key,0,-1)
|
377
339
|
out
|
378
340
|
end
|
379
341
|
|
380
|
-
|
381
|
-
|
342
|
+
private
|
343
|
+
|
344
|
+
def store
|
345
|
+
@@store ||= RedisObject.store
|
382
346
|
end
|
383
|
-
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
private
|
351
|
+
|
352
|
+
def store
|
353
|
+
@@store ||= RedisObject.store
|
384
354
|
end
|
385
355
|
|
386
356
|
end
|
@@ -1,36 +1,23 @@
|
|
1
1
|
module Seabright
|
2
2
|
module DefaultValues
|
3
3
|
|
4
|
+
def get(k)
|
5
|
+
if (d = self.class.default_vals[k.to_sym]) && !d.nil?
|
6
|
+
return d unless is_set?(k)
|
7
|
+
end
|
8
|
+
super(k)
|
9
|
+
end
|
10
|
+
|
4
11
|
module ClassMethods
|
5
12
|
|
6
13
|
def default_vals
|
7
14
|
@default_vals ||= {}
|
8
15
|
end
|
9
16
|
|
10
|
-
def intercept_for_defaults!
|
11
|
-
return if @intercepted_for_defaults
|
12
|
-
self.class_eval do
|
13
|
-
|
14
|
-
alias_method :undefaulted_get, :get unless method_defined?(:undefaulted_get)
|
15
|
-
def get(k)
|
16
|
-
if !is_set?(k) && (d = self.class.default_vals[k.to_sym]) && !d.nil?
|
17
|
-
return d
|
18
|
-
end
|
19
|
-
undefaulted_get(k)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
@intercepted_for_defaults = true
|
24
|
-
end
|
25
|
-
|
26
17
|
def register_default(k,vl)
|
27
18
|
default_vals[k.to_sym] = vl
|
28
|
-
intercept_for_defaults!
|
29
|
-
end
|
30
|
-
|
31
|
-
def default_for(k,vl)
|
32
|
-
register_default k, vl
|
33
19
|
end
|
20
|
+
alias_method :default_for, :register_default
|
34
21
|
|
35
22
|
end
|
36
23
|
|
@@ -1,43 +1,19 @@
|
|
1
1
|
module Seabright
|
2
2
|
module Filters
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
self.class_eval do
|
9
|
-
|
10
|
-
def filtered_method_call(method,*args)
|
11
|
-
if filters = self.class.filters_for(method)
|
12
|
-
filters.each do |f|
|
13
|
-
args = send(f,*args)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
send("unfiltered_#{method.to_s}".to_sym,*args)
|
17
|
-
end
|
18
|
-
|
19
|
-
alias_method :unfiltered_get, :get unless method_defined?(:unfiltered_get)
|
20
|
-
def get(k)
|
21
|
-
filtered_method_call(:get,k)
|
22
|
-
end
|
23
|
-
|
24
|
-
alias_method :unfiltered_set, :set unless method_defined?(:unfiltered_set)
|
25
|
-
def set(k,v)
|
26
|
-
filtered_method_call(:set,k,v)
|
27
|
-
end
|
28
|
-
|
29
|
-
alias_method :unfiltered_setnx, :setnx unless method_defined?(:unfiltered_setnx)
|
30
|
-
def setnx(k,v)
|
31
|
-
filtered_method_call(:setnx,k,v)
|
32
|
-
end
|
33
|
-
|
4
|
+
def filtered(method,*args)
|
5
|
+
if filters = self.class.filters_for(method)
|
6
|
+
filters.each do |f|
|
7
|
+
args = send(f,*args)
|
34
8
|
end
|
35
|
-
@intercept_for_filters = true
|
36
9
|
end
|
10
|
+
method(*args)
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
37
14
|
|
38
15
|
def set_filter(filter)
|
39
16
|
filter_method(:set,filter)
|
40
|
-
filter_method(:setnx,filter)
|
41
17
|
end
|
42
18
|
|
43
19
|
def get_filter(filter)
|
@@ -45,9 +21,15 @@ module Seabright
|
|
45
21
|
end
|
46
22
|
|
47
23
|
def filter_method(method, filter)
|
48
|
-
method_filters[method.to_sym]
|
24
|
+
unless method_filters[method.to_sym]
|
25
|
+
method_filters[method.to_sym] ||= []
|
26
|
+
filter!(method.to_sym)
|
27
|
+
end
|
49
28
|
method_filters[method.to_sym] << filter.to_sym unless method_filters[method.to_sym].include?(filter.to_sym)
|
50
|
-
|
29
|
+
end
|
30
|
+
|
31
|
+
def filter!(method)
|
32
|
+
self.class.instance_exec("")
|
51
33
|
end
|
52
34
|
|
53
35
|
def method_filters
|