no_backsies 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby ADDED
@@ -0,0 +1,47 @@
1
+ ---
2
+ source:
3
+ - meta
4
+ authors:
5
+ - name: 7rans
6
+ email: transfire@gmail.com
7
+ copyrights:
8
+ - holder: Rubyworks
9
+ year: '2009'
10
+ license: BSD-2-Clause
11
+ replacements: []
12
+ alternatives: []
13
+ requirements:
14
+ - name: qed
15
+ groups:
16
+ - test
17
+ development: true
18
+ - name: detroit
19
+ groups:
20
+ - build
21
+ development: true
22
+ dependencies: []
23
+ conflicts: []
24
+ repositories: []
25
+ resources:
26
+ home: http://rubyworks.github.com/no_backsies
27
+ code: http://github.com/rubyworks/no_backsies
28
+ mail: http://googlegroups/group/rubyworks-mailinglist
29
+ docs: http://rubydoc.info/gems/no_backsies/frames
30
+ extra: {}
31
+ load_path:
32
+ - lib
33
+ revision: 0
34
+ created: '2011-04-29'
35
+ summary: Better handling of Ruby callbacks
36
+ title: NoBacksies
37
+ version: 0.3.2
38
+ name: no_backsies
39
+ description: ! 'NoBacksies is a callback layer built on top of Ruby''s built-in callback
40
+
41
+ methods. It makes it possible to add new callbacks very easily, without
42
+
43
+ having to fuss with more nuanced issues of defining and redefining callback
44
+
45
+ methods.'
46
+ organization: Rubyworks
47
+ date: '2011-10-27'
@@ -0,0 +1,7 @@
1
+ --output-dir doc
2
+ --title NoBacksies
3
+ --protected
4
+ --private
5
+ lib/
6
+ -
7
+ [A-Z]*.*
@@ -1,5 +1,25 @@
1
1
  = RELEASE HISTORY
2
2
 
3
+ == 0.3.2 | 2011-10-27
4
+
5
+ This release adds support for calling super from within callback procedures.
6
+
7
+ Changes:
8
+
9
+ * Add support for calling super.
10
+
11
+
12
+ == 0.3.1 | 2011-07-06
13
+
14
+ Fix method argumements on const_missing, included, extended
15
+ and inherited callbacks.
16
+
17
+ Changes:
18
+
19
+ * Fixed callback arguments that have been copy/pasted. (blambeau)
20
+ * Add individual tests for each callback.
21
+
22
+
3
23
  == 0.3.0 | 2011-07-06
4
24
 
5
25
  This release is made primarily because the program is now
data/QED.rdoc CHANGED
@@ -286,7 +286,7 @@ Given a class that defines a no-backsies +const_missing+ callback.
286
286
  @list ||= []
287
287
  end
288
288
 
289
- callback :const_missing do |const|
289
+ callback :const_missing, :superless=>true do |const|
290
290
  list << const
291
291
  end
292
292
 
@@ -299,6 +299,8 @@ Then the results are as follows.
299
299
 
300
300
  Y.list #=> [:FOO, :BAR]
301
301
 
302
+ Notice we used `:superless` to prevent super from being called, which would
303
+ have raised an NameError.
302
304
 
303
305
  = Included
304
306
 
@@ -1,5 +1,12 @@
1
1
  = No Backsies
2
2
 
3
+ {Homepage}[http://rubyworks.github.com/no_backsies] |
4
+ {Development}[http://github.com/rubyworks/no_backsies] |
5
+ {Mailing List}[http://groups.google.com/group/rubyworks-mailinglist] |
6
+ {API Reference}[http://rubydoc.info/gems/no_backsies/frames] |
7
+ {Demonstrandum}[http://rubyworks.github.com/no_backsies/qed.html]
8
+
9
+
3
10
  == DESCRIPTION
4
11
 
5
12
  NoBacksies is a callback layer built on top of Ruby's built-in callback
@@ -8,13 +15,9 @@ having to fuss with more nuanced issues of defining and redefining callback
8
15
  methods.
9
16
 
10
17
 
11
- == RESOURCES
18
+ == Compatability
12
19
 
13
- * {Homepage}[http://rubyworks.github.com/no_backsies]
14
- * {Development}[http://github.com/rubyworks/no_backsies]
15
- * {Mailing List}[http://groups.google.com/group/rubyworks-mailinglist]
16
- * {API Reference}[http://rubydoc.info/gems/no_backsies/frames]
17
- * {Demonstrandum}[http://rubyworks.github.com/no_backsies/QED.html]
20
+ NoBacksies does not currently work with *Rubinius*. Anyone know why?
18
21
 
19
22
 
20
23
  == EXAMPLES
@@ -69,6 +72,37 @@ Install the RubyGems package in the usual fashion.
69
72
  $ gem install no_backsies
70
73
 
71
74
 
75
+ == CONTRIBUTE
76
+
77
+ === Development
78
+
79
+ Source code is hosted on GitHub[http://github.com/rubyworks/qed].
80
+ If you'd like to submit a patch please fork the repository and
81
+ submit a pull request (ideally in a topic branch).
82
+
83
+ === Testing
84
+
85
+ QED[http://rubyworks.github.com/qed] is used to testing.
86
+
87
+ $ gem install qed
88
+
89
+ To run the tests:
90
+
91
+ $ qed [path/to/test]
92
+
93
+ === Donations
94
+
95
+ Software development is very time consuming. Rubyworks does a lot of FOSS
96
+ development for el <i>$0</i>. We do it for the love of programming and
97
+ for Ruby. Any dollars that do come our way help us continue
98
+ the effort. So anything you may offer will help these projects such as this
99
+ continue to flourish.
100
+
101
+ See the {Rubyworks Homepage}[http://rubyworks.github.com].
102
+
103
+ Thanks.
104
+
105
+
72
106
  == LEGAL
73
107
 
74
108
  (BSD 2 License)
@@ -1,6 +1,6 @@
1
1
  # NoBacksies module ecapsulates all supported callback mixins.
2
2
  #
3
- # NoBackseis::Callbacks can be mixed-in and all supported callbacks will
3
+ # NoBacksies::Callbacks can be mixed-in and all supported callbacks will
4
4
  # be applied to the class or module.
5
5
  #
6
6
  # class Y
@@ -46,14 +46,50 @@
46
46
  # y = Y.new
47
47
  # y.foo! #=> "foo!"
48
48
  #
49
- # NOTE: Currently the NoBackies module only supports class level callbacks.
50
- # We will look into adding instance level callbacks in a future version.
49
+ # == Calling Super
51
50
  #
52
- #--
53
- # TODO: What about adding `super if defined?(super)` to callback methods?
54
- # Should this be standard? Should it occur before or after? Or should
55
- # in be controlled via a special callback, e.g. `callback method_added, :super`?
56
- #++
51
+ # Each callback invocation passes along a superblock procedure, which can be
52
+ # used to invoke `super` for the underlying callback method. For example,
53
+ # it is common to call `super` in a `const_missing` callback if the dynamic
54
+ # constant lookup fails.
55
+ #
56
+ # callback :const_missing do |const, &superblock|
57
+ # psuedo_constants[const] || superblock.call
58
+ # end
59
+ #
60
+ # By default, super is called after call callback procedures are called becuase
61
+ # that is by far the most commonly desired behavior. To suppress this behavior
62
+ # pass the `:superless=>true` flag to the `callback` method.
63
+ #
64
+ # callback :included, :superless=>true do |mod|
65
+ # ...
66
+ # end
67
+ #
68
+ # == Customizing the Underlying Callback Procedure
69
+ #
70
+ # Every callback follows the same simply pattern, e.g. for `method_added`:
71
+ #
72
+ # def self.method_added(method)
73
+ # if defined?(super)
74
+ # callback_invoke(:method_added, method){ super(method) }
75
+ # else
76
+ # callback_invoke(:method_added, method)
77
+ # end
78
+ # end
79
+ #
80
+ # So it is easy enough to customize if you have some special requirements.
81
+ # Say you want to call super before all callback procedures, and never allow
82
+ # any callback procedure to do so themselves, then you could simply redefine
83
+ # the underlying callback method as:
84
+ #
85
+ # def self.method_added(method)
86
+ # super(method) if defined?(super)
87
+ # callback_invoke(:method_added, method)
88
+ # end
89
+ #
90
+ # NOTE: Currently the NoBacksies module only supports class level callbacks.
91
+ # We will look into adding instance level callbacks, such as `method_missing`
92
+ # in a future version.
57
93
 
58
94
  module NoBacksies
59
95
 
@@ -115,23 +151,27 @@ module NoBacksies
115
151
  end
116
152
 
117
153
  # Invoke a callback.
118
- def callback_invoke(name, *args)
154
+ #
155
+ def callback_invoke(name, *args, &superblock)
119
156
  name = name.to_sym
120
157
  return unless callback_express[name]
121
158
  callbacks[name].each do |block, options|
122
159
  if options[:safe]
123
160
  callback_express(name=>false) do
124
- block.call(*args)
161
+ block.call(*args, &superblock)
125
162
  end
126
163
  else
127
- block.call(*args)
164
+ block.call(*args, &superblock)
128
165
  end
129
166
  if options[:once]
130
167
  callbacks[name].delete([block, options])
131
168
  end
169
+ if !options[:superless]
170
+ superblock.call if superblock
171
+ end
132
172
  end
133
173
  end
134
- end
174
+ end #module
135
175
 
136
176
  # Callback system for #method_added.
137
177
  module MethodAdded
@@ -143,7 +183,11 @@ module NoBacksies
143
183
 
144
184
  #
145
185
  def method_added(method)
146
- callback_invoke(:method_added, method)
186
+ if defined?(super)
187
+ callback_invoke(:method_added, method){ super(method) }
188
+ else
189
+ callback_invoke(:method_added, method)
190
+ end
147
191
  end
148
192
  end
149
193
 
@@ -157,7 +201,11 @@ module NoBacksies
157
201
 
158
202
  #
159
203
  def method_removed(method)
160
- callback_invoke(:method_removed, method)
204
+ if defined?(super)
205
+ callback_invoke(:method_removed, method){ super(method) }
206
+ else
207
+ callback_invoke(:method_removed, method)
208
+ end
161
209
  end
162
210
  end
163
211
 
@@ -171,7 +219,11 @@ module NoBacksies
171
219
 
172
220
  #
173
221
  def method_undefined(method)
174
- callback_invoke(:method_undefined, method)
222
+ if defined?(super)
223
+ callback_invoke(:method_undefined, method){ super(method) }
224
+ else
225
+ callback_invoke(:method_undefined, method)
226
+ end
175
227
  end
176
228
  end
177
229
 
@@ -185,11 +237,15 @@ module NoBacksies
185
237
 
186
238
  #
187
239
  def singleton_method_added(method)
188
- callback_invoke(:singleton_method_added, method)
240
+ if defined?(super)
241
+ callback_invoke(:singleton_method_added, method){ super(method) }
242
+ else
243
+ callback_invoke(:singleton_method_added, method)
244
+ end
189
245
  end
190
246
  end
191
247
 
192
- # Callback system for #method_removed.
248
+ # Callback system for #singleton_method_removed.
193
249
  module SingletonMethodRemoved
194
250
  #
195
251
  def self.append_features(base)
@@ -199,11 +255,15 @@ module NoBacksies
199
255
 
200
256
  #
201
257
  def singleton_method_removed(method)
202
- callback_invoke(:singleton_method_removed, method)
258
+ if defined?(super)
259
+ callback_invoke(:singleton_method_removed, method){ super(method) }
260
+ else
261
+ callback_invoke(:singleton_method_removed, method)
262
+ end
203
263
  end
204
264
  end
205
265
 
206
- # Callback system for #method_removed.
266
+ # Callback system for #singleton_method_undefined.
207
267
  module SingletonMethodUndefined
208
268
  #
209
269
  def self.append_features(base)
@@ -213,12 +273,16 @@ module NoBacksies
213
273
 
214
274
  #
215
275
  def singleton_method_undefined(method)
216
- callback_invoke(:singleton_method_undefined, method)
276
+ if defined?(super)
277
+ callback_invoke(:singleton_method_undefined, method){ super(method) }
278
+ else
279
+ callback_invoke(:singleton_method_undefined, method)
280
+ end
217
281
  end
218
282
  end
219
283
 
220
- # Callback system for #const_missing.
221
- module ConstMissing
284
+ # Callback system for #included.
285
+ module Included
222
286
  #
223
287
  def self.append_features(base)
224
288
  base.extend CallbackMethods
@@ -226,13 +290,17 @@ module NoBacksies
226
290
  end
227
291
 
228
292
  #
229
- def const_missing(const)
230
- callback_invoke(:const_missing, const)
293
+ def included(mod)
294
+ if defined?(super)
295
+ callback_invoke(:included, mod){ super(mod) }
296
+ else
297
+ callback_invoke(:included, mod)
298
+ end
231
299
  end
232
300
  end
233
301
 
234
- # Callback system for #included.
235
- module Included
302
+ # Callback system for #extended.
303
+ module Extended
236
304
  #
237
305
  def self.append_features(base)
238
306
  base.extend CallbackMethods
@@ -240,13 +308,17 @@ module NoBacksies
240
308
  end
241
309
 
242
310
  #
243
- def included(mod)
244
- callback_invoke(:included, mod)
311
+ def extended(mod)
312
+ if defined?(super)
313
+ callback_invoke(:extended, mod){ super(mod) }
314
+ else
315
+ callback_invoke(:extended, mod)
316
+ end
245
317
  end
246
318
  end
247
319
 
248
- # Callback system for #extended.
249
- module Extended
320
+ # Callback system for #inherited.
321
+ module Inherited
250
322
  #
251
323
  def self.append_features(base)
252
324
  base.extend CallbackMethods
@@ -254,13 +326,19 @@ module NoBacksies
254
326
  end
255
327
 
256
328
  #
257
- def extended(mod)
258
- callback_invoke(:extended, mod)
329
+ def inherited(base)
330
+ if defined?(super)
331
+ callback_invoke(:inherited, base){ super(base) }
332
+ else
333
+ callback_invoke(:inherited, base)
334
+ end
259
335
  end
260
336
  end
261
337
 
262
- # Callback system for #inherited.
263
- module Inherited
338
+ # Callback system for #const_missing.
339
+ #
340
+ # Unlike other callback mixins, this does NOT invoke super (for obvious reasons).
341
+ module ConstMissing
264
342
  #
265
343
  def self.append_features(base)
266
344
  base.extend CallbackMethods
@@ -268,10 +346,13 @@ module NoBacksies
268
346
  end
269
347
 
270
348
  #
271
- def inherited(base)
272
- callback_invoke(:inherited, base)
349
+ def const_missing(const)
350
+ if defined?(super)
351
+ callback_invoke(:const_missing, const){ super(const) }
352
+ else
353
+ callback_invoke(:const_missing, const)
354
+ end
273
355
  end
274
356
  end
275
357
 
276
358
  end
277
-
@@ -9,7 +9,7 @@ Given a class that defines a no-backsies +const_missing+ callback.
9
9
  @list ||= []
10
10
  end
11
11
 
12
- callback :const_missing do |const|
12
+ callback :const_missing, :superless=>true do |const|
13
13
  list << const
14
14
  end
15
15
 
@@ -22,3 +22,5 @@ Then the results are as follows.
22
22
 
23
23
  Y.list #=> [:FOO, :BAR]
24
24
 
25
+ Notice we used `:superless` to prevent super from being called, which would
26
+ have raised an NameError.
metadata CHANGED
@@ -1,52 +1,58 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: no_backsies
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2
4
5
  prerelease:
5
- version: 0.3.1
6
6
  platform: ruby
7
- authors:
8
- - Thomas Sawyer
7
+ authors:
8
+ - 7rans
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-06 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: qed
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &18797320 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: detroit
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *18797320
25
+ - !ruby/object:Gem::Dependency
26
+ name: detroit
27
+ requirement: &18712220 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
35
33
  type: :development
36
- version_requirements: *id002
37
- description: |-
38
- NoBacksies is a callback layer built on top of Ruby's built-in callback
34
+ prerelease: false
35
+ version_requirements: *18712220
36
+ description: ! 'NoBacksies is a callback layer built on top of Ruby''s built-in callback
37
+
39
38
  methods. It makes it possible to add new callbacks very easily, without
39
+
40
40
  having to fuss with more nuanced issues of defining and redefining callback
41
- methods.
42
- email: transfire@gmail.com
43
- executables: []
44
41
 
42
+ methods.'
43
+ email:
44
+ - transfire@gmail.com
45
+ executables: []
45
46
  extensions: []
46
-
47
- extra_rdoc_files:
47
+ extra_rdoc_files:
48
+ - HISTORY.rdoc
48
49
  - README.rdoc
49
- files:
50
+ - QED.rdoc
51
+ - COPYING.rdoc
52
+ - NOTICE.rdoc
53
+ files:
54
+ - .ruby
55
+ - .yardopts
50
56
  - lib/no_backsies.rb
51
57
  - qed/01_example.rdoc
52
58
  - qed/02_express.rdoc
@@ -68,34 +74,28 @@ files:
68
74
  - COPYING.rdoc
69
75
  - NOTICE.rdoc
70
76
  homepage: http://rubyworks.github.com/no_backsies
71
- licenses: []
72
-
77
+ licenses:
78
+ - BSD-2-Clause
73
79
  post_install_message:
74
- rdoc_options:
75
- - --title
76
- - NoBacksies API
77
- - --main
78
- - README.rdoc
79
- require_paths:
80
+ rdoc_options: []
81
+ require_paths:
80
82
  - lib
81
- required_ruby_version: !ruby/object:Gem::Requirement
83
+ required_ruby_version: !ruby/object:Gem::Requirement
82
84
  none: false
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: "0"
87
- required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
90
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: "0"
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
93
95
  requirements: []
94
-
95
- rubyforge_project: no_backsies
96
- rubygems_version: 1.8.2
96
+ rubyforge_project:
97
+ rubygems_version: 1.8.10
97
98
  signing_key:
98
99
  specification_version: 3
99
100
  summary: Better handling of Ruby callbacks
100
101
  test_files: []
101
-