fast_forward 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +2 -1
- data/lib/fast_forward.rb +28 -14
- data/test/test_fast_forward.rb +20 -1
- metadata +2 -11
data/README.txt
CHANGED
@@ -54,10 +54,11 @@ The cool feature with this setup is the fact that, one you call a method that ge
|
|
54
54
|
=> "Hello"
|
55
55
|
bar.respond_to?(:some_foo_method)
|
56
56
|
=> true
|
57
|
+
|
58
|
+
If the target of <tt>fast_forward_to</tt> is <tt>nil</tt>, a FastForwarding::DelegationToNilError will be raised any time a method that would use the delegation is invoked.
|
57
59
|
|
58
60
|
== REQUIREMENTS:
|
59
61
|
|
60
|
-
* activesupport (1.4.2 minimum, though previous versions will likely work), installed if you have Rails
|
61
62
|
* hoe
|
62
63
|
|
63
64
|
== INSTALL:
|
data/lib/fast_forward.rb
CHANGED
@@ -1,21 +1,35 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
|
-
|
4
1
|
module FastForwarding
|
2
|
+
|
3
|
+
class DelegationToNilError < ::NoMethodError; end
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def included(base)
|
8
|
+
base.send(:include, InstanceMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
module InstanceMethods
|
5
14
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
15
|
+
def fast_forward_to(object)
|
16
|
+
class_eval(<<-END_OF_METHOD_MISSING, "(__FAST_FORWARD__)", 1)
|
17
|
+
def method_missing_with_fast_forwarding(meth, *args, &block)
|
18
|
+
raise FastForwarding::DelegationToNilError, "Cannot delegate to nil: #{object}" if #{object}.nil?
|
19
|
+
result = #{object}.__send__(meth, *args, &block)
|
20
|
+
(class << self; self; end).module_eval(<<-EOS, "(__FAST_FORWARD_GENERATE_METHOD__)", 1)
|
21
|
+
def \#{meth}(*args, &block)
|
22
|
+
raise FastForwarding::DelegationToNilError, "Cannot delegate to nil: #{object}" if #{object}.nil?
|
23
|
+
#{object}.__send__(:\#{meth}, *args, &block)
|
13
24
|
end
|
14
|
-
|
25
|
+
EOS
|
26
|
+
result
|
15
27
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
28
|
+
alias_method :method_missing_without_fast_forwarding, :method_missing
|
29
|
+
alias_method :method_missing, :method_missing_with_fast_forwarding
|
30
|
+
END_OF_METHOD_MISSING
|
31
|
+
end
|
32
|
+
|
19
33
|
end
|
20
34
|
|
21
35
|
end
|
data/test/test_fast_forward.rb
CHANGED
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
class FastForwarded
|
11
11
|
fast_forward_to :target
|
12
|
-
|
12
|
+
attr_accessor :target
|
13
13
|
def initialize
|
14
14
|
@target = Target.new
|
15
15
|
end
|
@@ -38,6 +38,25 @@ class FastForwardTest < Test::Unit::TestCase
|
|
38
38
|
assert_equal :expected_return_value, fast_forwarded.a_method_that_exists
|
39
39
|
end
|
40
40
|
|
41
|
+
def test_calling_a_method_the_first_time_on_a_fast_forwarded_instance_when_target_object_is_nil_raises_delegation_to_nil_error
|
42
|
+
assert !fast_forwarded.respond_to?(:a_method_that_exists)
|
43
|
+
fast_forwarded.target = nil
|
44
|
+
assert_raises FastForwarding::DelegationToNilError do
|
45
|
+
fast_forwarded.a_method_that_exists
|
46
|
+
end
|
47
|
+
assert !fast_forwarded.respond_to?(:a_method_that_exists)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_calling_a_method_subsequent_times_on_a_fast_forwarded_instance_when_target_object_is_nil_raises_delegation_to_nil_error
|
51
|
+
assert !fast_forwarded.respond_to?(:a_method_that_exists)
|
52
|
+
assert_equal :expected_return_value, fast_forwarded.a_method_that_exists
|
53
|
+
assert fast_forwarded.respond_to?(:a_method_that_exists)
|
54
|
+
fast_forwarded.target = nil
|
55
|
+
assert_raises FastForwarding::DelegationToNilError do
|
56
|
+
fast_forwarded.a_method_that_exists
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
41
60
|
def test_calling_a_method_on_a_fast_forwarded_instance_may_be_forwarded_to_target_object_using_instance_var
|
42
61
|
fast_forward_with_instance_var = FastForwardUsingInstanceVar.new
|
43
62
|
assert !fast_forward_with_instance_var.respond_to?(:a_method_that_exists)
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: fast_forward
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date: 2007-05-
|
6
|
+
version: 1.0.1
|
7
|
+
date: 2007-05-14 00:00:00 -06:00
|
8
8
|
summary: Advanced delegation of method missing with dynamic generation of methods to reduce overhead
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -46,15 +46,6 @@ extensions: []
|
|
46
46
|
requirements: []
|
47
47
|
|
48
48
|
dependencies:
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: activesupport
|
51
|
-
version_requirement:
|
52
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
53
|
-
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 1.4.2
|
57
|
-
version:
|
58
49
|
- !ruby/object:Gem::Dependency
|
59
50
|
name: hoe
|
60
51
|
version_requirement:
|