提交 a107103e 编写于 作者: J José Valim 提交者: Yehuda Katz

Allow :instance_reader to be given to superclass_delegating_accessor as well.

上级 2aafdc83
require 'active_support/core_ext/object/blank' require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/array/extract_options'
class Class class Class
def superclass_delegating_reader(*names) def superclass_delegating_reader(*names)
class_name_to_stop_searching_on = superclass.name.blank? ? "Object" : superclass.name class_to_stop_searching_on = superclass.name.blank? ? "Object" : superclass.name
options = names.extract_options!
names.each do |name| names.each do |name|
class_eval(<<-EOS, __FILE__, __LINE__ + 1) # def self.only_reader
def self.#{name} # def self.only_reader # if defined?(@only_reader)
if defined?(@#{name}) # if defined?(@only_reader) # @only_reader
@#{name} # @only_reader # elsif superclass < Object && superclass.respond_to?(:only_reader)
elsif superclass < #{class_name_to_stop_searching_on} && # elsif superclass < Object && # superclass.only_reader
superclass.respond_to?(:#{name}) # superclass.respond_to?(:only_reader) # end
superclass.#{name} # superclass.only_reader # end
end # end class_eval <<-EOS, __FILE__, __LINE__ + 1
end # end def self.#{name}
def #{name} # def only_reader if defined?(@#{name})
self.class.#{name} # self.class.only_reader @#{name}
end # end elsif superclass < #{class_to_stop_searching_on} && superclass.respond_to?(:#{name})
def self.#{name}? # def self.only_reader? superclass.#{name}
!!#{name} # !!only_reader end
end # end end
def #{name}? # def only_reader?
!!#{name} # !!only_reader
end # end
EOS EOS
unless options[:instance_reader] == false
class_eval <<-EOS, __FILE__, __LINE__ + 1
def #{name} # def only_reader
self.class.#{name} # self.class.only_reader
end # end
def self.#{name}? # def self.only_reader?
!!#{name} # !!only_reader
end # end
def #{name}? # def only_reader?
!!#{name} # !!only_reader
end # end
EOS
end
end end
end end
def superclass_delegating_writer(*names, &block) def superclass_delegating_writer(*names, &block)
options = names.extract_options!
names.each do |name| names.each do |name|
class_eval(<<-EOS, __FILE__, __LINE__ + 1) class_eval <<-EOS, __FILE__, __LINE__ + 1
def self.#{name}=(value) # def self.property=(value) def self.#{name}=(value) # def self.property=(value)
@#{name} = value # @property = value @#{name} = value # @property = value
end # end end # end
EOS EOS
self.send("#{name}=", yield) if block_given?
self.send(:"#{name}=", yield) if block_given?
end end
end end
......
...@@ -52,6 +52,13 @@ def test_simple_accessor_declaration ...@@ -52,6 +52,13 @@ def test_simple_accessor_declaration
assert !single_class.public_instance_methods.map(&:to_s).include?("both=") assert !single_class.public_instance_methods.map(&:to_s).include?("both=")
end end
def test_simple_accessor_declaration_with_instance_reader_false
single_class.superclass_delegating_accessor :no_instance_reader, :instance_reader => false
assert single_class.respond_to?(:no_instance_reader)
assert single_class.respond_to?(:no_instance_reader=)
assert !single_class.public_instance_methods.map(&:to_s).include?("no_instance_reader")
end
def test_working_with_simple_attributes def test_working_with_simple_attributes
single_class.superclass_delegating_accessor :both single_class.superclass_delegating_accessor :both
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册