casting 0.3.1 → 0.4.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.
data/lib/casting.rb CHANGED
@@ -2,6 +2,19 @@ require 'redcard'
2
2
 
3
3
  module Casting
4
4
 
5
+ def self.delegating(assignments)
6
+ assignments.each do |object, mod|
7
+ object.send(:instance_variable_set, :@__previous_delegate__, object.instance_variable_get(:@__current_delegate__))
8
+ object.send(:instance_variable_set, :@__current_delegate__, mod)
9
+ end
10
+ yield
11
+ ensure
12
+ assignments.each do |object, mod|
13
+ object.send(:instance_variable_set, :@__current_delegate__, object.instance_variable_get(:@__previous_delegate__))
14
+ object.send(:remove_instance_variable, :@__previous_delegate__)
15
+ end
16
+ end
17
+
5
18
  class MissingAttendant < StandardError
6
19
  def message
7
20
  "You must set your attendant object using `to'."
@@ -12,6 +25,13 @@ module Casting
12
25
  end
13
26
 
14
27
  module Client
28
+
29
+ def self.included(base)
30
+ def base.delegate_missing_methods
31
+ self.send(:include, ::Casting::MissingMethodClient)
32
+ end
33
+ end
34
+
15
35
  def delegation(delegated_method_name)
16
36
  Casting::Delegation.new(delegated_method_name, self)
17
37
  end
@@ -19,6 +39,32 @@ module Casting
19
39
  def delegate(delegated_method_name, attendant, *args)
20
40
  delegation(delegated_method_name).to(attendant).with(*args).call
21
41
  end
42
+
43
+ def delegate_missing_methods
44
+ self.extend ::Casting::MissingMethodClient
45
+ end
46
+ end
47
+
48
+ module MissingMethodClient
49
+ def method_missing(meth, *args, &block)
50
+ if delegate_has_method?(meth)
51
+ delegate(meth, @__current_delegate__, *args, &block)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def delegate_has_method?(meth)
60
+ return false unless @__current_delegate__
61
+
62
+ if Module === @__current_delegate__
63
+ @__current_delegate__.instance_methods
64
+ else
65
+ @__current_delegate__.methods
66
+ end.include?(meth)
67
+ end
22
68
  end
23
69
 
24
70
  class PreparedDelegation
@@ -95,6 +141,7 @@ module Casting
95
141
  rescue NameError => e
96
142
  raise InvalidAttendant.new(e.message)
97
143
  end
144
+
98
145
  end
99
146
 
100
147
  class Delegation
@@ -125,4 +172,4 @@ module Casting
125
172
  end
126
173
 
127
174
  end
128
- end
175
+ end
@@ -1,3 +1,3 @@
1
1
  module Casting
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
data/test/casting_test.rb CHANGED
@@ -1,6 +1,43 @@
1
1
  require 'test_helper'
2
2
  require 'casting'
3
3
 
4
+ BlockTestPerson = Struct.new(:name)
5
+ BlockTestPerson.send(:include, Casting::Client)
6
+ BlockTestPerson.delegate_missing_methods
7
+
8
+ describe Casting, '.delegating' do
9
+ it 'delegates missing methods for the objects inisde the block' do
10
+ client = BlockTestPerson.new('Jim')
11
+ verbose_client = BlockTestPerson.new('Amy')
12
+
13
+ assert_raises(NoMethodError){
14
+ client.greet
15
+ }
16
+ Casting.delegating(client => TestPerson::Greeter, verbose_client => TestPerson::Verbose) do
17
+ assert_equal 'hello', client.greet
18
+ assert_equal 'this,that', verbose_client.verbose('this','that')
19
+ end
20
+ assert_raises(NoMethodError){
21
+ client.greet
22
+ }
23
+ end
24
+
25
+ it 'delegates missing methods on altered objects inside the block' do
26
+ client = test_person.extend(Casting::Client)
27
+ client.delegate_missing_methods
28
+
29
+ assert_raises(NoMethodError){
30
+ client.greet
31
+ }
32
+ Casting.delegating(client => TestPerson::Greeter) do
33
+ assert_equal 'hello', client.greet
34
+ end
35
+ assert_raises(NoMethodError){
36
+ client.greet
37
+ }
38
+ end
39
+ end
40
+
4
41
  describe Casting::Delegation do
5
42
 
6
43
  it 'initializes with method name and object' do
data/test/test_helper.rb CHANGED
@@ -20,7 +20,7 @@ class TestPerson
20
20
 
21
21
  module Verbose
22
22
  def verbose(arg1, arg2)
23
- %w{arg1 arg2}.join(',')
23
+ [arg1, arg2].join(',')
24
24
  end
25
25
  end
26
26
  end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: casting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Jim Gay
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-05-20 00:00:00.000000000 Z
12
+ date: 2013-05-22 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: redcard
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -35,29 +38,31 @@ files:
35
38
  - lib/casting/version.rb
36
39
  - test/test_helper.rb
37
40
  - test/casting_test.rb
38
- homepage: ''
41
+ homepage: http://github.com/saturnflyer/casting
39
42
  licenses: []
40
- metadata: {}
41
43
  post_install_message:
42
44
  rdoc_options: []
43
45
  require_paths:
44
46
  - lib
45
47
  required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
46
49
  requirements:
47
- - - '>='
50
+ - - ! '>='
48
51
  - !ruby/object:Gem::Version
49
52
  version: '0'
50
53
  required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
51
55
  requirements:
52
- - - '>='
56
+ - - ! '>='
53
57
  - !ruby/object:Gem::Version
54
58
  version: '0'
55
59
  requirements: []
56
60
  rubyforge_project:
57
- rubygems_version: 2.0.0
61
+ rubygems_version: 1.8.23
58
62
  signing_key:
59
- specification_version: 4
63
+ specification_version: 3
60
64
  summary: Proper method delegation.
61
65
  test_files:
62
66
  - test/test_helper.rb
63
67
  - test/casting_test.rb
68
+ has_rdoc:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 4cd9c772929ade9385c386920a6983f76b7d4499
4
- data.tar.gz: 30a9a0733b90d6b228bee245177c70ef59c75ea5
5
- SHA512:
6
- metadata.gz: 9f8fe2c025d614134d088537c2afe2f9513c7d474ab1d9e02d19e57cd2c0a03497ed35dab6bdacf268892dea6c167090abe2f48b39032c2cbf8daeaf27cbef98
7
- data.tar.gz: 6df689773211f4dab302fee36785709c883addb19672c0c662f9df0d4c9a3b8f8e2064f7d2625d222e8c1221d8f5b3b64b5f113722a033fc677288314415fdbe