# Copyright Pedro Ferreira 2005. Distributed under the Boost
# Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

import sys

class NullLogger:
    def __init__ (self):
        self.indent_ = ''
    
    def log (self, source_name, *args):
        if self.on () and self.interesting (source_name):
            self.do_log (self.indent_)
            for i in args:
                self.do_log (i)
            self.do_log ('\n')
    
    def increase_indent (self):
        if self.on ():
            self.indent_ += '    '
        
    def decrease_indent (self):
        if self.on () and len (self.indent_) > 4:
            self.indent_ = self.indent_ [-4:]

    def do_log (self, *args):
        pass
    
    def interesting (self, source_name):
        return False

    def on (self):
        return False

class TextLogger (NullLogger):
    def __init__ (self):
        NullLogger.__init__ (self)
    
    def do_log (self, arg):
            sys.stdout.write (str (arg))
    
    def interesting (self, source_name):
        return True

    def on (self):
        return True
