detach 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.