Extract DSL to a class

This commit is contained in:
Adrian Mugnolo and Santiago Pastorino 2014-01-10 16:47:07 -02:00
parent 1c440b513f
commit cf91146471
2 changed files with 49 additions and 26 deletions

View File

@ -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

View File

@ -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