classproxy 0.7.9 → 0.7.10

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.
@@ -101,27 +101,31 @@ module ClassProxy
101
101
  private
102
102
 
103
103
  def run_fallback(args, _self=nil)
104
- obj = _self || self.new
104
+ _self ||= self.new
105
105
 
106
- fallback_obj = obj.instance_exec args, &@fallback_fetch
106
+ _self.instance_eval "@proxied_with_nil ||= []"
107
+
108
+ fallback_obj = _self.instance_exec args, &@fallback_fetch
107
109
 
108
110
  # Use the after_fallback_method
109
- obj.instance_exec fallback_obj, &@after_fallback_method if @after_fallback_method.is_a? Proc
111
+ _self.instance_exec fallback_obj, &@after_fallback_method if @after_fallback_method.is_a? Proc
110
112
 
111
113
  # Go through the keys of the return object and try to use setters
112
- if fallback_obj and obj and fallback_obj.respond_to? :keys and fallback_obj.keys.respond_to? :each
114
+ if fallback_obj and fallback_obj.respond_to? :keys and fallback_obj.keys.respond_to? :each
113
115
  fallback_obj.keys.each do |key|
114
- next unless obj.respond_to? "#{key}="
116
+ next unless _self.respond_to? "#{key}="
115
117
 
116
118
  # check if its set to something else
117
- get_method = obj.respond_to?("no_proxy_#{key}") ? "no_proxy_#{key}" : key
118
- if obj.respond_to? get_method and obj.send(get_method) == nil
119
- obj.send("#{key}=", fallback_obj.send(key))
119
+ get_method = _self.respond_to?("no_proxy_#{key}") ? "no_proxy_#{key}" : key
120
+ if _self.respond_to? get_method and _self.send(get_method) == nil
121
+ value = fallback_obj.send(key)
122
+ _self.send("#{key}=", value)
123
+ _self.instance_eval "@proxied_with_nil << key" if value == nil
120
124
  end
121
125
  end
122
126
  end
123
127
 
124
- return obj
128
+ return _self
125
129
  end
126
130
 
127
131
  def proxy_method(method_name, proc=nil)
@@ -134,40 +138,42 @@ module ClassProxy
134
138
  # Use the no_proxy one first
135
139
  v = self.send("no_proxy_#{method_name}".to_sym, *args)
136
140
 
137
- # TODO -- Cache if this also returned nil so the fallback is not used
138
- # constantly on actual nil values
139
-
140
141
  # Since AR calls the getter method when using the setter method
141
142
  # to establish the dirty attribute, since the getter is being replaced
142
143
  # here and the setter is being used when appropriate, the @mutex_in_call_for
143
144
  # prevents endless recursion.
144
145
  @mutex_in_call_for ||= []
146
+ @proxied_with_nil ||= []
145
147
  if v == nil and not @mutex_in_call_for.include? method_name
146
- @mutex_in_call_for << method_name
147
- method = "_run_fallback_#{method_name}".to_sym
148
-
149
- if self.respond_to?(method)
150
- v = if self.method(method).arity == 1
151
- # Callback method is expecting to receive the fallback object
152
- fallback_fetch_method = self.class.instance_variable_get(:@fallback_fetch)
153
- fallback_obj = fallback_fetch_method[self]
154
- self.send(method, fallback_obj)
148
+ unless @proxied_with_nil.include? method_name
149
+ @mutex_in_call_for << method_name
150
+ method = "_run_fallback_#{method_name}".to_sym
151
+
152
+ if self.respond_to?(method)
153
+ # arity == 1 means that the callback is expecting the fallback object
154
+ v = if self.method(method).arity == 1
155
+ # Callback method is expecting to receive the fallback object
156
+ fallback_fetch_method = self.class.instance_variable_get(:@fallback_fetch)
157
+ fallback_obj = fallback_fetch_method[self]
158
+ self.send(method, fallback_obj)
159
+ else
160
+ # Callback method doesn't need the fallback object
161
+ self.send(method)
162
+ end
155
163
  else
156
- # Callback method doesn't need the fallback object
157
- self.send(method)
164
+ # This method has no callback, so just run the fallback
165
+ args_class = ArgsClass.new(self)
166
+ self.class.send :run_fallback, args_class, self
167
+
168
+ # The value might have changed, so check here
169
+ v = self.send("no_proxy_#{method_name}".to_sym)
158
170
  end
159
- else
160
- # This method has no callback, so just run the fallback
161
- args_class = ArgsClass.new(self)
162
- self.class.send :run_fallback, args_class, self
163
171
 
164
- # The value might have changed, so check here
165
- v = self.send("no_proxy_#{method_name}".to_sym)
172
+ # Set the defaults when this class responds to the same method
173
+ self.send("#{method_name}=".to_sym, v) if v and self.respond_to?("#{method_name}=")
174
+ @mutex_in_call_for.delete method_name
175
+ @proxied_with_nil << method_name if v == nil
166
176
  end
167
-
168
- # Set the defaults when this class responds to the same method
169
- self.send("#{method_name}=".to_sym, v) if v and self.respond_to?("#{method_name}=")
170
- @mutex_in_call_for.delete method_name
171
177
  end
172
178
 
173
179
  return v
@@ -1,3 +1,3 @@
1
1
  module ClassProxy
2
- VERSION = '0.7.9'
2
+ VERSION = '0.7.10'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: classproxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.9
4
+ version: 0.7.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
12
+ date: 2012-12-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
55
  version: '0'
56
56
  segments:
57
57
  - 0
58
- hash: 3154749862381023825
58
+ hash: 1492446742885892984
59
59
  required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  none: false
61
61
  requirements: