loverload 0.1.0 → 0.2.0

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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjRlMDExM2QwMGU4ZmQwMmY4NjQ5OGViMGQzNWIyNzNhMDllOTE1ZA==
5
+ data.tar.gz: !binary |-
6
+ YmRhMzc2YmU3OGU0Mzg1YjM4MjkzYWJjMmM4OTkwMzQ1OGY3OGJjOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MTc1MzRjZTIxM2VhYTY0MTFhMGIwNjM5ZmMyMWMyY2M0ZDNiNDZkNWM2MjNh
10
+ ODcwMTZjMWJkOGI5ODk3ZGZlMGU3MWNhNTNlMjBkYzA0ZDBmMDZlMjIwN2Jj
11
+ ODUwMjRhMTQyYjkyZGM0YmUzODAxOWU0ODFmYThjODlmZDY5MTI=
12
+ data.tar.gz: !binary |-
13
+ MjAwNGQzMjhkYWI0MWFmMDQzMmZjNWJlNzI3NWI0MzlmNWI0MTlmNjdmYTBk
14
+ ZmQ5N2IwMzRmOWU5NjgzZjBhZGMyNmE0ZTNmMWIyMjE2NGNhMjRjZDdlOGUz
15
+ YjUyOGE0NGQ4ZTQ5OTY4NDlhNGI0ZGJkZmNmYjE1MjRmNjNmNDE=
@@ -0,0 +1,11 @@
1
+ module Loverload
2
+ class Block
3
+
4
+ attr_reader :block
5
+
6
+ def initialize(&block)
7
+ @block = block.to_proc
8
+ end
9
+
10
+ end
11
+ end
@@ -2,28 +2,38 @@ module Loverload
2
2
  class Method
3
3
  def initialize klass, method_name, &with_params_block
4
4
  @klass, @method_name = klass, method_name
5
- @klass.instance_variable_set :@__dictionary__, {} unless
6
- @klass.instance_variable_defined? :@__dictionary__
5
+
6
+ dictionary || @klass.instance_variable_set(:@__dictionary__, {})
7
7
 
8
8
  instance_eval(&with_params_block)
9
9
  end
10
10
 
11
11
  def with_params *pars, &block
12
- dictionary[method_signature(block.arity, *pars)] = block
12
+ arg_count = block.arity
13
+ arg_count += 1 if pars.last == ::Loverload::Block
14
+ dictionary[method_signature(arg_count, *pars)] = block
13
15
  end
14
16
 
15
- def overload instance, *args
16
- instance.instance_exec *args, &find(*args)
17
+ def overload instance, *args, &block
18
+ if block_given?
19
+ args << Block.new(&block)
20
+ found = find(*args)
21
+ instance.instance_exec *args do |*args|
22
+ found.call(*args, &(args.pop.block))
23
+ end
24
+ else
25
+ instance.instance_exec *args, &find(*args)
26
+ end
17
27
  end
18
28
 
19
29
  private
20
- def find *args
30
+ def find(*args)
21
31
  dictionary.find do |signature, _|
22
32
  match? signature, method_signature(args.size, *args)
23
33
  end.tap{ |arr| raise NoMethodError unless arr }.last
24
34
  end
25
35
 
26
- def match? signature, args
36
+ def match?(signature, args)
27
37
  signature.zip(args).all? do |type, arg|
28
38
  type === arg
29
39
  end
@@ -33,7 +43,7 @@ module Loverload
33
43
  @klass.instance_variable_get(:@__dictionary__)
34
44
  end
35
45
 
36
- def method_signature size, *meta
46
+ def method_signature(size, *meta)
37
47
  [*@method_name, size, *meta]
38
48
  end
39
49
  end
@@ -1,3 +1,3 @@
1
1
  module Loverload
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/loverload.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "loverload/version"
2
+ require "loverload/block"
2
3
  require "loverload/method"
3
4
 
4
5
  module Loverload
@@ -9,18 +10,18 @@ module Loverload
9
10
  end
10
11
 
11
12
  module ClassMethods
12
- def def_overload method_name_or_class, method_name = NULL, &with_params_block
13
+ def def_overload(method_name_or_class, method_name = NULL, &with_params_block)
13
14
  if method_name_or_class.is_a?(Class) && method_name != NULL
14
15
  method = Method.new(method_name_or_class, method_name, &with_params_block)
15
16
 
16
- define_singleton_method method_name do |*args|
17
- method.overload(method_name_or_class, *args)
17
+ define_singleton_method method_name do |*args, &block|
18
+ method.overload(method_name_or_class, *args, &block)
18
19
  end
19
20
  else
20
21
  method = Method.new(self, method_name_or_class, &with_params_block)
21
22
 
22
- define_method method_name_or_class do |*args|
23
- method.overload(self, *args)
23
+ define_method method_name_or_class do |*args, &block|
24
+ method.overload(self, *args, &block)
24
25
  end
25
26
  end
26
27
  end
@@ -246,6 +246,28 @@ describe Loverload do
246
246
  dummy.hello(2).should eql 'Two'
247
247
  end
248
248
 
249
+ it "supports blocks" do
250
+ class Dummy
251
+ include Loverload
252
+
253
+ def_overload :hello do
254
+ with_params String do |s|
255
+ "Arg 1: #{s}. No block."
256
+ end
257
+
258
+ with_params String, Block do |s, &block|
259
+ "Arg 1: #{s}. Block present; results in: #{block.yield}."
260
+ end
261
+ end
262
+ end
263
+
264
+ dummy = Dummy.new
265
+ dummy.hello('str1').should eql 'Arg 1: str1. No block.'
266
+ dummy.hello 'str2' do
267
+ 'str3'
268
+ end.should eql 'Arg 1: str2. Block present; results in: str3.'
269
+ end
270
+
249
271
  it "works with inheritance" do
250
272
  class Dummy
251
273
  include Loverload
@@ -348,4 +370,30 @@ describe Loverload do
348
370
  dummy = Dummy.new
349
371
  [*0..10].map(&dummy.method(:fibonnaci)).should eql [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
350
372
  end
373
+
374
+ it "can pass lambda and yielded" do
375
+ class Dummy
376
+ include Loverload
377
+
378
+ def_overload :pass_block do
379
+ with_params Proc do |blok|
380
+ blok.call
381
+ end
382
+
383
+ with_params String, Proc do |append_me, blok|
384
+ blok.call(append_me)
385
+ end
386
+ end
387
+ end
388
+
389
+ dummy = Dummy.new
390
+
391
+ expect{ dummy.pass_block('Hello from lambda') }.to raise_error
392
+
393
+ dummy.pass_block(lambda{ 'Hello from lambda' }).should eql 'Hello from lambda'
394
+ dummy.pass_block(->{ 'Hello from lambda' }).should eql 'Hello from lambda'
395
+ dummy.pass_block( Proc.new{ 'Hello from lambda' }).should eql 'Hello from lambda'
396
+
397
+ dummy.pass_block('Append me', lambda{ |s| "#{ s } and Hello from lambda" }).should eql 'Append me and Hello from lambda'
398
+ end
351
399
  end
metadata CHANGED
@@ -1,80 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loverload
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.0
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Teja Sophista V.R.
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-05 00:00:00.000000000 Z
11
+ date: 2014-12-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- prerelease: false
16
14
  name: bundler
17
- type: :development
18
- version_requirements: !ruby/object:Gem::Requirement
15
+ requirement: !ruby/object:Gem::Requirement
19
16
  requirements:
20
17
  - - ~>
21
18
  - !ruby/object:Gem::Version
22
19
  version: '1.3'
23
- none: false
24
- requirement: !ruby/object:Gem::Requirement
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
25
23
  requirements:
26
24
  - - ~>
27
25
  - !ruby/object:Gem::Version
28
26
  version: '1.3'
29
- none: false
30
27
  - !ruby/object:Gem::Dependency
31
- prerelease: false
32
28
  name: rake
33
- type: :development
34
- version_requirements: !ruby/object:Gem::Requirement
29
+ requirement: !ruby/object:Gem::Requirement
35
30
  requirements:
36
31
  - - ! '>='
37
32
  - !ruby/object:Gem::Version
38
33
  version: '0'
39
- none: false
40
- requirement: !ruby/object:Gem::Requirement
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
41
37
  requirements:
42
38
  - - ! '>='
43
39
  - !ruby/object:Gem::Version
44
40
  version: '0'
45
- none: false
46
41
  - !ruby/object:Gem::Dependency
47
- prerelease: false
48
42
  name: rspec
49
- type: :development
50
- version_requirements: !ruby/object:Gem::Requirement
43
+ requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
45
  - - ! '>='
53
46
  - !ruby/object:Gem::Version
54
47
  version: '0'
55
- none: false
56
- requirement: !ruby/object:Gem::Requirement
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - ! '>='
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
- none: false
62
55
  - !ruby/object:Gem::Dependency
63
- prerelease: false
64
56
  name: debugger
65
- type: :development
66
- version_requirements: !ruby/object:Gem::Requirement
57
+ requirement: !ruby/object:Gem::Requirement
67
58
  requirements:
68
59
  - - ! '>='
69
60
  - !ruby/object:Gem::Version
70
61
  version: '0'
71
- none: false
72
- requirement: !ruby/object:Gem::Requirement
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
73
65
  requirements:
74
66
  - - ! '>='
75
67
  - !ruby/object:Gem::Version
76
68
  version: '0'
77
- none: false
78
69
  description: DSL for building method overloading in Ruby more magical
79
70
  email:
80
71
  - tejanium@yahoo.com
@@ -88,6 +79,7 @@ files:
88
79
  - README.md
89
80
  - Rakefile
90
81
  - lib/loverload.rb
82
+ - lib/loverload/block.rb
91
83
  - lib/loverload/method.rb
92
84
  - lib/loverload/version.rb
93
85
  - loverload.gemspec
@@ -95,6 +87,7 @@ files:
95
87
  homepage: http://github.com/tejanium/loverload
96
88
  licenses:
97
89
  - MIT
90
+ metadata: {}
98
91
  post_install_message:
99
92
  rdoc_options: []
100
93
  require_paths:
@@ -103,25 +96,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
96
  requirements:
104
97
  - - ! '>='
105
98
  - !ruby/object:Gem::Version
106
- segments:
107
- - 0
108
- hash: 2984216650687558397
109
99
  version: '0'
110
- none: false
111
100
  required_rubygems_version: !ruby/object:Gem::Requirement
112
101
  requirements:
113
102
  - - ! '>='
114
103
  - !ruby/object:Gem::Version
115
- segments:
116
- - 0
117
- hash: 2984216650687558397
118
104
  version: '0'
119
- none: false
120
105
  requirements: []
121
106
  rubyforge_project:
122
- rubygems_version: 1.8.25
107
+ rubygems_version: 2.4.5
123
108
  signing_key:
124
- specification_version: 3
109
+ specification_version: 4
125
110
  summary: DSL for building method overloading in Ruby
126
111
  test_files:
127
112
  - spec/loverload/loverload_spec.rb