loverload 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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