unextendable 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +4 -0
- data/README.textile +1 -1
- data/VERSION +1 -1
- data/lib/unextendable/object.rb +5 -3
- data/lib/unextendable/version.rb +5 -1
- data/test/object_instance_test.rb +28 -0
- data/unextendable.gemspec +1 -1
- metadata +4 -4
data/CHANGELOG.rdoc
CHANGED
data/README.textile
CHANGED
@@ -14,7 +14,7 @@ A gem that allows objects to effectively mixin and unmix modules. The downside i
|
|
14
14
|
|
15
15
|
*Evil-ruby* - "Github repository":https://github.com/yugui/evil-ruby
|
16
16
|
|
17
|
-
A gem that extends Ruby's semantics by accessing its internals from pure Ruby code. I do not want to mess with Ruby internals too much just for what I want to implement. As the name already, is it ethical or just evil? I will let you judge that. By the way, "evilr":https://github.com/jeremyevans/evilr is its brother written in C.
|
17
|
+
A gem that extends Ruby's semantics by accessing its internals from pure Ruby code. I do not want to mess with Ruby internals too much just for what I want to implement. As the name already says, is it ethical or just evil? I will let you judge that. By the way, "evilr":https://github.com/jeremyevans/evilr is its brother written in C.
|
18
18
|
|
19
19
|
*StatePattern* - "Github repository":https://github.com/dcadenas/state_pattern
|
20
20
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/lib/unextendable/object.rb
CHANGED
@@ -26,12 +26,14 @@ class Object
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def unextend(*modules)
|
29
|
+
def unextend(*modules, &block)
|
30
30
|
if modules.empty?
|
31
|
-
meta_class.extended_modules.delete_if
|
31
|
+
meta_class.extended_modules.delete_if do |mod|
|
32
|
+
mod.unextendable? if !block_given? || block.call(mod)
|
33
|
+
end
|
32
34
|
else
|
33
35
|
modules.each do |mod|
|
34
|
-
meta_class.extended_modules.delete mod
|
36
|
+
meta_class.extended_modules.delete mod if !block_given? || block.call(mod)
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
data/lib/unextendable/version.rb
CHANGED
@@ -143,6 +143,23 @@ class ObjectInstanceTest < Test::Unit::TestCase
|
|
143
143
|
assert !@c.meta_class.extended_modules.include?(U)
|
144
144
|
end
|
145
145
|
|
146
|
+
should "remove the module but when passed a block only when it passes" do
|
147
|
+
assert_equal "Mr. C", @c.salutation
|
148
|
+
|
149
|
+
@c.extend U
|
150
|
+
assert_equal "Mr. U", @c.salutation
|
151
|
+
|
152
|
+
@c.unextend do |mod|
|
153
|
+
mod != U
|
154
|
+
end
|
155
|
+
assert_equal "Mr. U", @c.salutation
|
156
|
+
|
157
|
+
@c.unextend do |mod|
|
158
|
+
mod == U
|
159
|
+
end
|
160
|
+
assert_equal "Mr. C", @c.salutation
|
161
|
+
end
|
162
|
+
|
146
163
|
context "when calling an unextendable method" do
|
147
164
|
should "match the expected method" do
|
148
165
|
assert_equal @c.method(:name), @c.send(:method_for, :name)
|
@@ -207,6 +224,17 @@ class ObjectInstanceTest < Test::Unit::TestCase
|
|
207
224
|
|
208
225
|
@c.unextend
|
209
226
|
assert_equal "Ms. A", @c.salutation
|
227
|
+
|
228
|
+
@c.extend U
|
229
|
+
@c.unextend do |mod|
|
230
|
+
mod != U
|
231
|
+
end
|
232
|
+
assert_equal "Ms. U", @c.salutation
|
233
|
+
|
234
|
+
@c.unextend do |mod|
|
235
|
+
mod == U
|
236
|
+
end
|
237
|
+
assert_equal "Ms. A", @c.salutation
|
210
238
|
end
|
211
239
|
end
|
212
240
|
end
|
data/unextendable.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.email = ["paul.engel@holder.nl"]
|
11
11
|
s.homepage = "https://github.com/archan937/unextendable"
|
12
12
|
s.summary = %q{A small gem making unextending extended module methods within object instances possible}
|
13
|
-
s.description = %q{Unextendable originated from the thought of being able to implement the
|
13
|
+
s.description = %q{Unextendable originated from the thought of being able to implement the State pattern within object instances using modules. In other words: I wanted object instances to behave dependent on their state using modules. I really want to use modules because they are commonly used to define a set of methods which you can extend within an object instance. Unfortunately, you cannot just unexclude a module. So after searching the web for solutions, I came across Mixology, evil-ruby and StatePattern. But they slightly did not fit the picture. So after doing some research, I came up with Unextendable.}
|
14
14
|
|
15
15
|
s.rubyforge_project = "unextendable"
|
16
16
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unextendable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Paul Engel
|
@@ -46,7 +46,7 @@ dependencies:
|
|
46
46
|
version: "0"
|
47
47
|
type: :development
|
48
48
|
version_requirements: *id002
|
49
|
-
description: "Unextendable originated from the thought of being able to implement the
|
49
|
+
description: "Unextendable originated from the thought of being able to implement the State pattern within object instances using modules. In other words: I wanted object instances to behave dependent on their state using modules. I really want to use modules because they are commonly used to define a set of methods which you can extend within an object instance. Unfortunately, you cannot just unexclude a module. So after searching the web for solutions, I came across Mixology, evil-ruby and StatePattern. But they slightly did not fit the picture. So after doing some research, I came up with Unextendable."
|
50
50
|
email:
|
51
51
|
- paul.engel@holder.nl
|
52
52
|
executables: []
|