Skip to content

Commit

Permalink
SettingObject: Refactored complex #method_missing
Browse files Browse the repository at this point in the history
  • Loading branch information
ledermann committed Mar 7, 2013
1 parent b428d01 commit 2bd272b
Showing 1 changed file with 21 additions and 14 deletions.
35 changes: 21 additions & 14 deletions lib/app/models/setting_object.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ class SettingObject < ActiveRecord::Base

validates_presence_of :var, :value, :target_type
validate do
unless target_class.default_settings[var.to_sym]
unless _target_class
.default_settings[var.to_sym]
errors.add(:var, "#{var} is not defined!")
end
end
Expand All @@ -25,27 +26,33 @@ def method_missing(method_name, *args, &block)
super
else
if method_name.to_s =~ REGEX_SETTER && args.size == 1
# Setter
if self.value[$1] != args.first
self.value_will_change!

if args.first.nil?
self.value.delete($1)
else
self.value[$1] = args.first
end
end
_set_value($1, args.first)
elsif method_name.to_s =~ REGEX_GETTER && args.size == 0
# Getter
self.value[$1] || target_class.default_settings[var.to_sym][$1]
_get_value($1)
else
super
end
end
end

private
def target_class
def _get_value(name)
value[name] || _target_class.default_settings[var.to_sym][name]
end

def _set_value(name, v)
if value[name] != v
value_will_change!

if v.nil?
value.delete(name)
else
value[name] = v
end
end
end

def _target_class
target_type.constantize
end

Expand Down

0 comments on commit 2bd272b

Please sign in to comment.