mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Define module attr methods at caller location
Before: [1] pry(main)> $ ActiveJob::Base.default_priority From: lib/active_support/core_ext/module/attribute_accessors.rb @ line 64: Owner: ActiveJob::QueuePriority::ClassMethods Visibility: public Number of lines: 3 def #{sym} @@#{sym} end After: [1] pry(main)> $ ActiveJob::Base.default_priority From: /home/jhawthorn/src/rails/activejob/lib/active_job/queue_priority.rb @ line 9: Owner: ActiveJob::QueuePriority::ClassMethods Visibility: public Number of lines: 1 mattr_accessor :default_priority
This commit is contained in:
parent
cd0fbaea01
commit
22115751f3
1 changed files with 21 additions and 30 deletions
|
@ -48,28 +48,23 @@ class Module
|
|||
# end
|
||||
#
|
||||
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
||||
def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil)
|
||||
def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil, location: nil)
|
||||
location ||= caller_locations(1, 1).first
|
||||
|
||||
definition = []
|
||||
syms.each do |sym|
|
||||
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
@@#{sym} = nil unless defined? @@#{sym}
|
||||
|
||||
def self.#{sym}
|
||||
@@#{sym}
|
||||
end
|
||||
EOS
|
||||
definition << "def self.#{sym}; @@#{sym}; end"
|
||||
|
||||
if instance_reader && instance_accessor
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def #{sym}
|
||||
@@#{sym}
|
||||
end
|
||||
EOS
|
||||
definition << "def #{sym}; @@#{sym}; end"
|
||||
end
|
||||
|
||||
sym_default_value = (block_given? && default.nil?) ? yield : default
|
||||
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil?
|
||||
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil? && class_variable_defined?("@@#{sym}")
|
||||
end
|
||||
|
||||
module_eval(definition.join(";"), location.path, location.lineno)
|
||||
end
|
||||
alias :cattr_reader :mattr_reader
|
||||
|
||||
|
@ -115,28 +110,23 @@ class Module
|
|||
# end
|
||||
#
|
||||
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
||||
def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil)
|
||||
def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil, location: nil)
|
||||
location ||= caller_locations(1, 1).first
|
||||
|
||||
definition = []
|
||||
syms.each do |sym|
|
||||
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
@@#{sym} = nil unless defined? @@#{sym}
|
||||
|
||||
def self.#{sym}=(obj)
|
||||
@@#{sym} = obj
|
||||
end
|
||||
EOS
|
||||
definition << "def self.#{sym}=(val); @@#{sym} = val; end"
|
||||
|
||||
if instance_writer && instance_accessor
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def #{sym}=(obj)
|
||||
@@#{sym} = obj
|
||||
end
|
||||
EOS
|
||||
definition << "def #{sym}=(val); @@#{sym} = val; end"
|
||||
end
|
||||
|
||||
sym_default_value = (block_given? && default.nil?) ? yield : default
|
||||
send("#{sym}=", sym_default_value) unless sym_default_value.nil?
|
||||
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil? && class_variable_defined?("@@#{sym}")
|
||||
end
|
||||
|
||||
module_eval(definition.join(";"), location.path, location.lineno)
|
||||
end
|
||||
alias :cattr_writer :mattr_writer
|
||||
|
||||
|
@ -205,8 +195,9 @@ class Module
|
|||
#
|
||||
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
||||
def mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil, &blk)
|
||||
mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, &blk)
|
||||
mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default)
|
||||
location = caller_locations(1, 1).first
|
||||
mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, location: location, &blk)
|
||||
mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default, location: location)
|
||||
end
|
||||
alias :cattr_accessor :mattr_accessor
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue