module Brief class Publisher::HandlerManager attr_reader :publisher, :document def initialize(publisher, document) @publisher = publisher @document = document end def parser @parser ||= document.parser end def handlers find_parent = lambda do |parent_id| parser.tree.find(parent_id) end get_manager = -> { self } @handlers ||= publisher.order.inject({}) do |memo, level| config = publisher.config_for_level(level) klass_name = config.publish.klass klass = klass_name.nil? ? Brief::Handlers::Base : (klass_name.to_s.constantize rescue Brief::Handlers::Base) memo[level] = parser.tree.level(level).map do |element| obj = klass.new(element) obj.parent(&find_parent) obj.get_manager(&get_manager) obj end memo end end def run publisher.order.each do |level| objects = handlers[level] objects.each(&:handle!) end end end end