phalconplus Documentation v1.2.0
    namespace PhalconPlus\Logger\Processor;

class Trace extends AbstractProcessor
{
    const T_FILE  = 0x0001;
    const T_CLASS = 0x0010;

    private skipClassesPartials = [];
    private mode = self::T_FILE;
    private limit = 15;

    public function __construct(int mode = self::T_FILE, array skipClassesPartials = [])
    {
        let this->mode = mode;
        if !empty skipClassesPartials {
            let this->skipClassesPartials = skipClassesPartials;
        } else {
            let this->skipClassesPartials = [
                "PhalconPlus\\Logger\\", 
                "PhalconPlus\\Facades\\", 
                "Phalcon\\",
                "Exception"
            ];
        }
    }

    public function setLimit(int limit = 15)
    {
        let this->limit = limit;
    }

    public function __toString()
    {
        var trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, this->limit);
        // skip first since it's always the current method
        array_shift(trace);
        // the MultiPleFile::log method is also skipped
        array_shift(trace);

        var i = 0, j = i, part;

        %{CHECK:}%
        while isset trace[i] {
            var tmp = trace[i]; 
            // unset(tmp["object"], tmp["args"]);
            // error_log(var_export(tmp, true));
            if isset trace[i]["class"] && j == i {
                // error_log("Class: " .trace[i]["class"]);
                for part in this->skipClassesPartials {
                    if strpos(tmp["class"], part) !== false {
                        // error_log("###" . tmp["class"]);
                        let i = i + 1, j = i;
                        %{goto CHECK;}%
                    }
                }
            }
            // let i = i + 1;
            break;
        }

        var k, trace1 = [], trace2 = [];
        let k = j - 1;

        let trace1 = [
            "file" : isset(trace[k]["file"]) ? trace[k]["file"] : "Nil",
            "line" : isset(trace[k]["line"]) ? trace[k]["line"] : -1
        ];

        let trace2 = [
            "class"    : isset(trace[j]["class"]) ? trace[j]["class"] : "Nil",
            "function" : isset(trace[j]["function"]) ? trace[j]["function"] : "Nil"
        ];

        switch this->mode & 0x0011 {
            case self::T_CLASS:
                return join(":", trace2);
            case 0x11:
                return join(":", trace1) . "][" . join(":", trace2);
            case self::T_FILE:
            default:
                return join(":", trace1);
        }
    }
}