Module: SelectiveAttributeProxy
- Included in:
- Aliyun::OSS::Logging::Status, Aliyun::OSS::OSSObject, Aliyun::OSS::Owner
- Defined in:
- lib/aliyun/oss/extensions.rb
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
Class Method Details
.included(klass) ⇒ Object
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
# File 'lib/aliyun/oss/extensions.rb', line 306 def self.included(klass) klass.extend(ClassMethods) klass.class_eval(<<-EVAL, __FILE__, __LINE__) cattr_accessor :attribute_proxy cattr_accessor :attribute_proxy_options # Default name for attribute storage self.attribute_proxy = :attributes self.attribute_proxy_options = {:exclusively => true} private # By default proxy all attributes def proxiable_attribute?(name) return true unless self.class.attribute_proxy_options[:exclusively] send(self.class.attribute_proxy).has_key?(name) end def method_missing(method, *args, &block) # Autovivify attribute storage if method == self.class.attribute_proxy ivar = "@\#{method}" instance_variable_set(ivar, {}) unless instance_variable_get(ivar).is_a?(Hash) instance_variable_get(ivar) # Delegate to attribute storage elsif method.to_s =~ /^(\\w+)(=?)$/ && proxiable_attribute?($1) attributes_hash_name = self.class.attribute_proxy $2.empty? ? send(attributes_hash_name)[$1] : send(attributes_hash_name)[$1] = args.first else super end end EVAL end |