overider 0.0.1 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mkd +12 -5
- data/lib/overider.rb +4 -6
- data/lib/overider/version.rb +1 -1
- data/spec/overider_spec.rb +49 -0
- metadata +3 -3
data/README.mkd
CHANGED
@@ -13,15 +13,18 @@ but may become a problem for larger projects.
|
|
13
13
|
In the [same post](http://blog.jayfields.com/2006/12/ruby-alias-method-alternative.html),
|
14
14
|
Jay offered an interesting alternative to `alias`,
|
15
15
|
using instead `Module#instance_method` and `Module#define_method`.
|
16
|
-
This is much better,
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
This is much better, but I'm not quite satisfied.
|
17
|
+
While obvious enough to experienced Ruby-hands,
|
18
|
+
people who are newer to Ruby (like me!)
|
19
|
+
might have trouble remembering the syntax of `x = self.instance_method(:x)`
|
20
|
+
and `x.bind(self).call` every time they need to use this.
|
21
|
+
What I'd really like is a way to override defined methods that's a no-brainer.
|
21
22
|
|
22
23
|
So I thought about how I could take Jay's example one step further
|
23
24
|
and after some trial and lots of error came up with this.
|
24
25
|
|
26
|
+
Thanks and credit go to [Jay Fields](http://blog.jayfields.com/) for his post.
|
27
|
+
|
25
28
|
## Description
|
26
29
|
A mix-in module that allows for super-clean method over-riding without resorting to `alias`
|
27
30
|
or making unbound methods visible.
|
@@ -48,3 +51,7 @@ or making unbound methods visible.
|
|
48
51
|
## See also
|
49
52
|
* [Ruby: Alias method alternative, Jay Fields](http://blog.jayfields.com/2006/12/ruby-alias-method-alternative.html)
|
50
53
|
* <https://github.com/soveran/override>
|
54
|
+
|
55
|
+
## LICENSE
|
56
|
+
* [Ruby License](http://www.ruby-lang.org/en/LICENSE.txt)
|
57
|
+
* <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">overider.gem</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://westside-consulting.com/" property="cc:attributionName" rel="cc:attributionURL">Lawrence Siden</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://github.com/lsiden" rel="dct:source">github.com</a>.
|
data/lib/overider.rb
CHANGED
@@ -5,11 +5,9 @@ module Overider
|
|
5
5
|
orig_unbound_method = self.instance_method(sym)
|
6
6
|
|
7
7
|
define_method(sym) do |*a, &blk|
|
8
|
-
orig_self = self
|
9
|
-
obj = Object.new
|
10
8
|
|
11
|
-
|
12
|
-
orig_bound_method = orig_unbound_method.bind(
|
9
|
+
self.define_singleton_method(:overiden) do |*a, &blk|
|
10
|
+
orig_bound_method = orig_unbound_method.bind(self)
|
13
11
|
|
14
12
|
if !!blk then
|
15
13
|
orig_bound_method.call *a, &blk
|
@@ -19,9 +17,9 @@ module Overider
|
|
19
17
|
end
|
20
18
|
|
21
19
|
if !!blk then
|
22
|
-
|
20
|
+
self.instance_exec *a, blk, &pr
|
23
21
|
else
|
24
|
-
|
22
|
+
self.instance_exec *a, &pr
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
data/lib/overider/version.rb
CHANGED
data/spec/overider_spec.rb
CHANGED
@@ -153,4 +153,53 @@ describe Overider do
|
|
153
153
|
result = F.new.hello ->{ "block" }
|
154
154
|
result.should == "hello block in F"
|
155
155
|
end
|
156
|
+
|
157
|
+
it 'can access instance variables' do
|
158
|
+
module HelloModule
|
159
|
+
def hello
|
160
|
+
"hello "
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class G
|
165
|
+
include HelloModule
|
166
|
+
extend Overider
|
167
|
+
|
168
|
+
def initialize
|
169
|
+
@one = 'one'
|
170
|
+
@two = 'two'
|
171
|
+
end
|
172
|
+
|
173
|
+
# In the overide block, we have to declare blk as a normal block arg, not &blk.
|
174
|
+
# It must be a Proc or lambda
|
175
|
+
overide :hello do
|
176
|
+
overiden + "#{@one} and #{@two}"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
result = G.new.hello ->{ "block" }
|
181
|
+
result.should == "hello one and two"
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'can access instance variables defined in base class' do
|
185
|
+
module HelloModule
|
186
|
+
def hello
|
187
|
+
"hello "
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
class H < G
|
192
|
+
include HelloModule
|
193
|
+
extend Overider
|
194
|
+
|
195
|
+
# In the overide block, we have to declare blk as a normal block arg, not &blk.
|
196
|
+
# It must be a Proc or lambda
|
197
|
+
overide :hello do
|
198
|
+
overiden + " and again: #{@one} and #{@two}"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
result = H.new.hello ->{ "block" }
|
203
|
+
result.should == "hello one and two and again: one and two"
|
204
|
+
end
|
156
205
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-12-23 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &79785640 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *79785640
|
25
25
|
description: ! "\n class A\n def hello\n \"hello\"\n end\n end\n\n
|
26
26
|
\ # Later, I want to overide class A methods\n\n class A\n extend Overider\n\n
|
27
27
|
\ overide (:hello) do |*a|\n overiden(*a) + \" overide\"\n end\n
|