func NewPrinter(name string, output io.Writer) *Printer {
	if output == nil {
		output = NopOutput()
	}
	atomic.AddInt32(&TotalPrinters, 1)
	if name == "" {
		totalPrinters := atomic.LoadInt32(&TotalPrinters)
		lens := strconv.Itoa(int(totalPrinters))
		name = "printer_" + lens
	}
	buf := &bytes.Buffer{}
	isOuputTerminal := isTerminal(output)
	p := &Printer{
		Name:       name,
		Output:     output,
		Writer:     buf,
		Reader:     buf,
		Closer:     NopCloser(),
		IsTerminal: isOuputTerminal,
	}
	return p
}
NewPrinter returns a new named printer
if "output" is nil then it doesn't prints anywhere.

If "name" is empty then it will be filled with
"printer_$printers.len".

If the marshaler is nil, meaning that this writer's
result will never being proceed, caller should
add a marshaler using the `Marshal` function.

Look `OutputFrom` too.
package pio
import (
	"bufio"
	"bytes"
	"io"
	"io/ioutil"
	"strconv"
	"sync"
	"sync/atomic"
	"github.com/kataras/pio/terminal"
)
type (
	Handler func(PrintResult)
)
type Printer struct {
	Name       string
	IsTerminal bool
	priority   int  
	Chained  bool
	Output   io.Writer
	mu       sync.Mutex
	marshal  MarshalerFunc
	hijack   Hijacker
	handlers []Handler
	io.Reader
	io.Writer
	io.Closer
	DirectOutput bool
}
var (
	TotalPrinters int32
)