diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index fba7fffa..aa5598f4 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -2,8 +2,10 @@ require 'active_model/array_serializer' require 'active_model/serializable' require 'active_model/serializer/associations' require 'active_model/serializer/config' +require 'active_model/serializer/dsl' require 'thread' +require 'forwardable' module ActiveModel class Serializer @@ -68,36 +70,14 @@ end name.demodulize.underscore.sub(/_serializer$/, '') if name end - def attributes(*attrs) - @_attributes.concat attrs + extend Forwardable - attrs.each do |attr| - define_method attr do - object.read_attribute_for_serialization attr - end unless method_defined?(attr) - end - end - - def has_one(*attrs) - associate(Association::HasOne, *attrs) - end - - def has_many(*attrs) - associate(Association::HasMany, *attrs) - end + def_delegators :dsl, :attributes, :has_one, :has_many private - def associate(klass, *attrs) - options = attrs.extract_options! - - attrs.each do |attr| - define_method attr do - object.send attr - end unless method_defined?(attr) - - @_associations[attr] = klass.new(attr, options) - end + def dsl + @dsl ||= DSL.new self end end diff --git a/lib/active_model/serializer/dsl.rb b/lib/active_model/serializer/dsl.rb new file mode 100644 index 00000000..ce5bdf1d --- /dev/null +++ b/lib/active_model/serializer/dsl.rb @@ -0,0 +1,43 @@ +module ActiveModel + class Serializer + class DSL + attr_reader :serializer_class + + def initialize(serializer_class) + @serializer_class = serializer_class + end + + def attributes(*names) + serializer_class._attributes.concat names + + names.each do |name| + serializer_class.send :define_method, name do + object.read_attribute_for_serialization name + end unless serializer_class.method_defined? name + end + end + + def has_one(*names) + associate Association::HasOne, *names + end + + def has_many(*names) + associate Association::HasMany, *names + end + + private + + def associate(klass, *names) + options = names.extract_options! + + names.each do |name| + serializer_class.send :define_method, name do + object.send name + end unless serializer_class.method_defined? name + + serializer_class._associations[name] = klass.new name, options + end + end + end + end +end