+ join '/', qw(info debug1 debug2 query trace error_call_trace request_timer WARNING)[ grep { (reverse split //, sprintf "%08b", $_[0])[$_] } 0..7 ]
+}
+
+sub begin_request {
+ my $self = shift;
+ return 1 unless want_request_timer();
+ $self->set_request_timer;
+}
+
+sub end_request {
+ my $self = shift;
+ return 1 unless want_request_timer();
+ $self->_write("time", $self->get_request_time);
+
+ $self->{calldepth} = 0;
+}
+
+sub log_time {
+ my $self = shift;
+ return 1 unless want_request_timer();
+ $self->_write("time", $self->get_request_time);
+}
+
+sub get_request_time {
+ my $self = shift;
+ return $self->want_request_timer && $self->{request_start} ? tv_interval($self->{request_start}) : undef;
+}
+
+sub set_request_timer {
+ my $self = shift;
+ $self->{request_start} = [gettimeofday];
+}
+
+sub want_request_timer {
+ $global_level & REQUEST_TIMER;
+}
+
+sub file {
+ @_ == 2 ? $_[0]->{file} = $_[1] : $_[0]->{file};
+}
+
+sub _by_name {
+ my ($self, $level) = @_;
+ my $meth = $self->can(uc $level);
+ die 'unknown level' unless $meth;
+ $meth->();
+}
+
+sub level_by_name {
+ my ($self, $level, $val) = @_;
+ if (@_ == 3) {
+ $global_level |= $self->_by_name($level) if $val;
+ $global_level &= ~$self->_by_name($level) if !$val;
+ }
+ return $global_level & $self->_by_name($level);