class Class
Private Instance Methods
attr_accessor(*args)
click to toggle source
# File lib/better_attrs/class.rb, line 6 def attr_accessor(*args) attr_reader *extract_attrs_from_args(args) attr_writer *args end
Also aliased as: original_attr_accessor
attr_writer(*args)
click to toggle source
# File lib/better_attrs/class.rb, line 13 def attr_writer(*args) attrs = extract_attrs_from_args(args) opts = extract_opts_from_args(args) attrs.each { |attr| define_attr_writer(attr, opts) } end
Also aliased as: original_attr_writer
callback_for_attr(attr, opts)
click to toggle source
# File lib/better_attrs/class.rb, line 19 def callback_for_attr(attr, opts) opts[:"#{attr}_changed"] || opts[:"#{attr}_updated"] end
define_attr_writer(attr, opts)
click to toggle source
# File lib/better_attrs/class.rb, line 23 def define_attr_writer(attr, opts) class_eval do # Memoized state instance_variable = instance_variable_for_attr(attr) callback = callback_for_attr(attr, opts) writer_method = writer_method_for_attr(attr) define_method(writer_method) do |new_value| # Capture the `old_value` old_value = instance_variable_get(instance_variable) # Short-circuit if the values are the same return new_value if old_value == new_value # Update the instance-variable instance_variable_set(instance_variable, new_value) # Update the attributes `Hash` if it is present send(:[]=, attr, new_value) if defined?(::Rails) && respond_to?(:attributes) # Short-circuit if no callback was specified return new_value if callback.nil? # Callable object (e.g. `Proc`, `Lambda`) instance_exec(old_value, new_value, &callback) if callback.respond_to?(:call) # Method name (must be `String` or `Symbol`) send(callback, old_value, new_value) if [String, Symbol].include?(callback.class) end end end
extract_attrs_from_args(args)
click to toggle source
# File lib/better_attrs/class.rb, line 55 def extract_attrs_from_args(args) args.last.is_a?(Hash) ? args[0..-2] : args end
extract_opts_from_args(args)
click to toggle source
# File lib/better_attrs/class.rb, line 59 def extract_opts_from_args(args) args.last.is_a?(Hash) ? args.last : {} end
instance_variable_for_attr(attr)
click to toggle source
# File lib/better_attrs/class.rb, line 63 def instance_variable_for_attr(attr) :"@#{attr}" end
writer_method_for_attr(attr)
click to toggle source
# File lib/better_attrs/class.rb, line 67 def writer_method_for_attr(attr) :"#{attr}=" end