poly_delegate 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/poly_delegate/call.rb +35 -0
- data/lib/poly_delegate/delegated.rb +3 -23
- data/lib/poly_delegate/force_bind.rb +2 -2
- data/lib/poly_delegate/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86b1a5ce6f8911671007a0098b5e9f39f04c7e0d
|
4
|
+
data.tar.gz: a44f331f4029d053e1e1cc12efd37657c1ea6343
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e718e86a89b8b37d79cba03e95220812df46539ec4a0c042a26fdf4b51e7d2a886f9106c77127f68418fb921d1916de00878588b7cb2a5940a9423570fec535
|
7
|
+
data.tar.gz: fac1d66d0991b33041b1ed2e307b641e0e9036a4e9dab4b8620904cbaaaeb14e95e0585ee0e6ce4caf59c5bc766e205d514b5934462450403846705da0a67c9f
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright (c) 2016 Nathan Currier
|
3
|
+
|
4
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
5
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
6
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
7
|
+
|
8
|
+
require 'poly_delegate/method'
|
9
|
+
|
10
|
+
module PolyDelegate
|
11
|
+
def self.distinguish_delegator(obj, *args)
|
12
|
+
delegator =
|
13
|
+
if args.empty? || !args.first.is_a?(Delegator)
|
14
|
+
obj
|
15
|
+
else
|
16
|
+
args.shift
|
17
|
+
end
|
18
|
+
|
19
|
+
[delegator, args]
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.delegate_call(obj, method, *args, &block)
|
23
|
+
delegator, args = distinguish_delegator(obj, *args)
|
24
|
+
bound = force_bind(delegator, method)
|
25
|
+
bound.call(*args, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.create_delegated_method(klass, name)
|
29
|
+
method = klass.instance_method(name)
|
30
|
+
|
31
|
+
redefine_method(klass, name) do |*args, &block|
|
32
|
+
PolyDelegate.delegate_call(self, method, *args, &block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -5,9 +5,9 @@
|
|
5
5
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
6
6
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
7
7
|
|
8
|
+
require 'poly_delegate/call'
|
8
9
|
require 'poly_delegate/classic_access'
|
9
10
|
require 'poly_delegate/force_bind'
|
10
|
-
require 'poly_delegate/method'
|
11
11
|
|
12
12
|
module PolyDelegate
|
13
13
|
module Delegated
|
@@ -19,7 +19,7 @@ module PolyDelegate
|
|
19
19
|
intercepted = intercepted.map(&:instance_methods).reduce(&:-)
|
20
20
|
|
21
21
|
intercepted.each do |name|
|
22
|
-
|
22
|
+
PolyDelegate.create_delegated_method(base, name)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -27,31 +27,11 @@ module PolyDelegate
|
|
27
27
|
module ClassMethods
|
28
28
|
include ClassicAttributeAccess
|
29
29
|
|
30
|
-
def __create_delegated_method__(name)
|
31
|
-
method = instance_method(name)
|
32
|
-
|
33
|
-
PolyDelegate.redefine_method(self, name) do |*args, &block|
|
34
|
-
__delegated_call__(method, *args, &block)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def __delegated_call__(method, *args, &block)
|
39
|
-
delegator =
|
40
|
-
if args.empty? || !args.first.is_a?(Delegator)
|
41
|
-
self
|
42
|
-
else
|
43
|
-
args.shift
|
44
|
-
end
|
45
|
-
|
46
|
-
bound = PolyDelegate.force_bind(delegator, method)
|
47
|
-
bound.call(*args, &block)
|
48
|
-
end
|
49
|
-
|
50
30
|
def method_added(name)
|
51
31
|
return if %i(method_missing initialize).include?(name)
|
52
32
|
return if PolyDelegate.callers(2).include?(:redefine_method)
|
53
33
|
|
54
|
-
|
34
|
+
PolyDelegate.create_delegated_method(self, name)
|
55
35
|
end
|
56
36
|
end
|
57
37
|
end
|
@@ -5,8 +5,6 @@
|
|
5
5
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
6
6
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
7
7
|
|
8
|
-
require 'force_bind' if RUBY_ENGINE == 'ruby'
|
9
|
-
|
10
8
|
module PolyDelegate
|
11
9
|
# rubocop:disable Lint/DuplicateMethods
|
12
10
|
case RUBY_ENGINE
|
@@ -17,6 +15,8 @@ module PolyDelegate
|
|
17
15
|
Method.new(bound_obj, *method_args)
|
18
16
|
end
|
19
17
|
when 'ruby'
|
18
|
+
require 'force_bind'
|
19
|
+
|
20
20
|
def self.force_bind(bound_obj, method)
|
21
21
|
if bound_obj.class == method.owner
|
22
22
|
method.bind(bound_obj)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poly_delegate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Currier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
type: :runtime
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- gemfiles/Gemfile.ci
|
42
42
|
- gemfiles/Gemfile.doc
|
43
43
|
- lib/poly_delegate.rb
|
44
|
+
- lib/poly_delegate/call.rb
|
44
45
|
- lib/poly_delegate/classic_access.rb
|
45
46
|
- lib/poly_delegate/delegated.rb
|
46
47
|
- lib/poly_delegate/delegator.rb
|