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