no_backsies 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-