diff --git a/lib/contentful_model/base.rb b/lib/contentful_model/base.rb index 236decb..022fb2a 100644 --- a/lib/contentful_model/base.rb +++ b/lib/contentful_model/base.rb @@ -58,20 +58,32 @@ def nillable?(name, value) self.class.return_nil_for_empty_attribute_fields.include?(name) end + def field_getter(name) + result = filter_invalids( + self.class.coerce_value(name, fields[name]) + ) + + return nil if nillable?(name, result) + + result + end + def define_fields_methods fields.keys.each do |name| define_singleton_method name do - result = filter_invalids( - self.class.coerce_value(name, fields[name]) - ) - - return nil if nillable?(name, result) - - result + field_getter(name) end end end + def method_missing(name, *args, &block) + if content_type_field?(name) && fields.key?(name) + field_getter(name) + else + super + end + end + def override_getters define_sys_methods define_fields_methods diff --git a/lib/contentful_model/manageable.rb b/lib/contentful_model/manageable.rb index 2ecd362..5b7fedd 100644 --- a/lib/contentful_model/manageable.rb +++ b/lib/contentful_model/manageable.rb @@ -106,11 +106,31 @@ def define_setters end end + def field_setter(name, value) + @dirty = true + @changed_fields << name + fields[name] = value + end + def define_setter(name) define_singleton_method "#{name.to_s.underscore}=" do |value| - @dirty = true - @changed_fields << name - fields[name] = value + field_setter(name, value) + end + end + + def method_missing(name, *args, &block) + if (matches = name.match(/^(?.*)=$/)) && content_type_field?(matches[:field].to_sym) + field_setter(matches[:field].to_sym, args[0]) + else + super + end + end + + def respond_to_missing?(name, include_private = false) + if matches = name.match(/^(?.*)=$/) + content_type_field?(matches[:field].to_sym) || super + else + super end end