detach 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/detach.rb +15 -2
  3. data/test/test_detach.rb +13 -0
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ba9c0e79e1a40c353935809ce7801c920dfa165
4
- data.tar.gz: 2329de7b5d64b8bf06bdee4bdc8ecea2b15212d7
3
+ metadata.gz: 5abfdee74c072d0045db1449206a1981f76fb981
4
+ data.tar.gz: 9d734361d833db8179dc65aa230ec7d0554c523d
5
5
  SHA512:
6
- metadata.gz: c3b43161120fde5187ed4ce40fb70aaa81b072e94ef4476b551442117f0428264e75a807ea6606e4605d16258dd5d3f1a0075a1fbb86257494f9d68eadaa78a0
7
- data.tar.gz: 6966463b0059c1142ba8473e1f01808cfe2c14ce3e61b85ec4baa068b67d970a2e6c26f8c8983ba94a7d2bf9a76e353a04d355167b70c1c44a817eb3b12a188d
6
+ metadata.gz: 8237013c771426b631c600eeda141b69a93be5d00322a79d48ee790c26ad2e6dba6fa077fff37afd93c378640aafad44fcb39e031ddf6ace6ba3dc07893590e1
7
+ data.tar.gz: 05b0f1515d5ac61a891686be779f10c5b29cbfb63a5a92e0f15377fe2eb2bce3ca2e444d48d1c6274b8760654eb4e4b1da7376fffc883b15008f5d33bc0d1b2d
data/lib/detach.rb CHANGED
@@ -29,7 +29,20 @@ module Detach
29
29
  # Varargs and default values are interpolated with actual values. Predefined classes
30
30
  # are compared to actual classes using equality and inheritence checks.
31
31
  def method_missing(name, *args, &block)
32
- (score,best) = (public_methods+protected_methods+private_methods).grep(/^#{name}\(/).collect {|candidate|
32
+ obj_method_missing = -> {
33
+ BasicObject.instance_method(:method_missing).bind(self).call(name, *args, &block)
34
+ }
35
+
36
+ # some early returns are necessary when Detach has been mixed into
37
+ # the class of object 'main'
38
+ case name
39
+ when :to_ary
40
+ return obj_method_missing.call
41
+ when :taking
42
+ return Types.instance_method(:taking).bind(self.class).call if self.class == Object
43
+ end
44
+
45
+ (score,best) = (public_methods+protected_methods+private_methods).grep(/^#{Regexp.escape(name)}\(/).collect {|candidate|
33
46
  # extract paramters
34
47
  params = /\((.*)\)/.match(candidate.to_s)[1].scan(/(\w+)-([\w:)]+)/).collect {|s,t|
35
48
  [s.to_sym, t.split(/::/).inject(Kernel) {|m,c| m = m.const_get(c)}]
@@ -65,7 +78,7 @@ module Detach
65
78
 
66
79
  }.max {|a,b| a[0] <=> b[0]}
67
80
 
68
- (not score or score == 0) ? super : method(best)[*args, &block]
81
+ (not score or score == 0) ? obj_method_missing.call : method(best)[*args, &block]
69
82
  end
70
83
 
71
84
  # The Detach::Types module is inserted as a parent of the class which includes the
data/test/test_detach.rb CHANGED
@@ -36,6 +36,10 @@ class TestDetach < Test::Unit::TestCase
36
36
  assert_equal "P::M 42", Foo.new.foo(P::M.new)
37
37
  end
38
38
 
39
+ def testMethodNamedTaking
40
+ assert_equal "hello", Bar.new.taking("hello")
41
+ end
42
+
39
43
  def testConstructor
40
44
  assert_equal "hello world", Wow.new("hello", "world").to_s
41
45
  assert_equal "11", Wow.new(5, 6).to_s
@@ -118,6 +122,15 @@ class TestDetach < Test::Unit::TestCase
118
122
  end
119
123
  end
120
124
 
125
+ class Bar
126
+ include Detach
127
+
128
+ taking[String]
129
+ def taking(s)
130
+ @s = s
131
+ end
132
+ end
133
+
121
134
  class Wow
122
135
  include Detach
123
136
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: detach
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Calhoun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-19 00:00:00.000000000 Z
11
+ date: 2014-08-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A mixin which separates method definitions by argument types, effectively
14
14
  allowing C++ or Java style overloading.