summaryrefslogtreecommitdiff
path: root/lib/soap/mapping/registry.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/soap/mapping/registry.rb')
-rw-r--r--lib/soap/mapping/registry.rb57
1 files changed, 16 insertions, 41 deletions
diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb
index 24cd57fa71..e62706f2d8 100644
--- a/lib/soap/mapping/registry.rb
+++ b/lib/soap/mapping/registry.rb
@@ -64,75 +64,50 @@ end
# For anyType object: SOAP::Mapping::Object not ::Object
class Object; include Marshallable
def initialize
- @__soap_members = []
@__soap_value_type = {}
+ @__soap_value = {}
end
def [](name)
- if @__soap_members.include?(name)
- self.__send__(name)
- else
- self.__send__(Object.safe_name(name))
- end
+ @__soap_value[name]
end
def []=(name, value)
- if @__soap_members.include?(name)
- self.__send__(name + '=', value)
- else
- self.__send__(Object.safe_name(name) + '=', value)
- end
+ @__soap_value[name] = value
end
def __soap_set_property(name, value)
- var_name = name
- unless @__soap_members.include?(name)
- var_name = __define_attr_accessor(var_name)
+ unless @__soap_value.key?(name)
+ __define_attr_accessor(name)
end
- __soap_set_property_value(var_name, value)
- var_name
+ __soap_set_property_value(name, value)
end
private
def __soap_set_property_value(name, value)
- org = self.__send__(name)
+ org = self[name]
case @__soap_value_type[name]
when :single
- self.__send__(name + '=', [org, value])
+ self[name] = [org, value]
@__soap_value_type[name] = :multi
when :multi
org << value
else
- self.__send__(name + '=', value)
+ self[name] = value
@__soap_value_type[name] = :single
end
value
end
def __define_attr_accessor(name)
- var_name = name
- begin
- instance_eval <<-EOS
- def #{ var_name }
- @#{ var_name }
- end
-
- def #{ var_name }=(value)
- @#{ var_name } = value
- end
- EOS
- rescue SyntaxError
- var_name = Object.safe_name(var_name)
- retry
- end
- @__soap_members << var_name
- var_name
- end
-
- def Object.safe_name(name)
- require 'md5'
- "var_" << MD5.new(name).hexdigest
+ sclass = class << self; self; end
+ sclass.__send__(:define_method, name, proc {
+ self[name]
+ })
+ sclass.__send__(:define_method, name + '=', proc { |value|
+ self[name] = value
+ })
end
end