class ApplicationSerializer attr_reader :object def initialize(object, options = {}) @object = object @options = options end def to_json JSON.generate(as_json) end def as_json raise NotImplementedError end end module FancyAttributeDSL def self.included(klass) klass.extend ClassMethods end def as_json hash = {} self.class._serialized_attributes.each do |attr, block| hash[attr] = read_attribute_for_serialization(attr, &block) end hash end private def read_attribute_for_serialization(attr, &block) if block instance_eval(&block) elsif respond_to?(attr) send(attr) else object.send(attr) end end module ClassMethods def _serialized_attributes @_serialized_attributes ||= {} end def attributes(*keys) keys.each { |key| _serialized_attributes[key] = nil } end def attribute(key, &block) _serialized_attributes[key] = block end end end