+require 'rubygems'
+require 'isna'
+require 'logger'
+
+module Cobalt
+
+ class Console
+
+ attr_accessor :keep_in_buffer, :separator_length
+
+ def initialize( options = {} )
+ @indent = 0
+ @loggers = options[:loggers] || [::Logger.new(STDOUT)]
+ @keep_in_buffer = false
+ @temporal_buffer = []
+ @separator_length = 120
+ @color = :white
+ end
+
+ def add_logger logger
+ @loggers << logger
+ end
+
+ def remove_logger logger
+ @loggers = @loggers - [logger]
+ end
+
+ def release_buffer
+ @keep_in_buffer = false
+ @temporal_buffer.each do |line|
+ @loggers.each { |logger| logger.info(line) }
+ end
+ @temporal_buffer = []
+ nil
+ end
+
+ def log(*objects)
+ objects.each do |object|
+
+ the_string = object.to_s
+ the_string = the_string.to_ansi.send(@color).to_s
+ the_string = the_string.gsub(/^/, ' ' * @indent)
+
+ @loggers.each do |logger|
+ if @keep_in_buffer
+ @temporal_buffer << the_string
+ next
+ end
+ logger.info the_string
+ end
+
+ end
+ self
+ end
+
+ def pp(*objects)
+ dump = ""
+ if objects.size > 1
+ PP.pp(objects, dump)
+ else
+ PP.pp(objects.first, dump)
+ end
+ log(dump)
+ end
+
+ def notice(*objects)
+ color(:cyan) { log(*objects) }
+ end
+
+ def warn(*objects)
+ color(:yellow) { log(*objects) }
+ end
+
+ def error(*objects)
+ color(:red) { log(*objects) }
+ end
+
+ def separator(type = '-')
+ log((type * (@separator_length - @indent)))
+ end
+
+ def space(lines = 1)
+ lines.times { self.log('') }
+ self
+ end
+
+ def indent
+ if block_given?
+ @indent = @indent + 2
+ yield
+ @indent = @indent - 2
+ else
+ @indent = @indent + 2
+ end
+ self
+ end
+
+ def outdent
+ @indent = @indent - 2
+ self
+ end
+
+ def color(symbol)
+ if block_given?
+ old = @color
+ @color = symbol
+ yield
+ @color = old
+ else
+ @color = symbol
+ end
+ self
+ end
+
+ end
+
+end