require "cereal_box/version"

module CerealBox

  def self.included(base)
    base.send(:attr_accessor, :cereal_box_base_instance)
    base.send(:attr_accessor, :cereal_box_previous_filter)
  end

  def initialize(base)
    @cereal_box_base_instance = base
  end

  def cereal_box_node_name
    self.class.to_s.split(/(?=[A-Z])/).map{ |w| w.downcase }[0...-1].join("_").to_sym
  end

  def serializable_hash(options = {})
    apply(:serializable_hash, options)
  end

  def as_json(options = {}) 
    apply(:as_json, options)
  end

  def as_xml(options = {}) 
    apply(:as_xml, options)
  end

  def apply(message, options = {})
    target = @cereal_box_previous_filter ? @cereal_box_previous_filter : @cereal_box_base_instance
    target.send(message.to_sym, options).merge(
      { cereal_box_node_name => self.send(:attributes, @cereal_box_base_instance) }
    )
  end

end