package Log::Any::IfLOG;

our $DATE = '2019-01-09'; # DATE
our $VERSION = '0.090'; # VERSION

our $DEBUG;

my $log_singleton;
sub __log_singleton {
    if (!$log_singleton) { $log_singleton = Log::Any::IfLOG::DumbObj->new }

sub __log_enabled {
    if (defined $ENABLE_LOG) {
        return $ENABLE_LOG;
    } elsif ($INC{'Log/'}) {
        # Log::Any has been loaded, so we have absorbed the cost anyway
        return 1;
    } else {
            $ENV{LOG} || $ENV{TRACE} || $ENV{DEBUG} ||
            $ENV{VERBOSE} || $ENV{QUIET} || $ENV{LOG_LEVEL};

sub import {
    my $self = shift;

    my $caller = caller();
    if (__log_enabled()) {
        require Log::Any;
        Log::Any->_export_to_caller($caller, @_);
    } else {
        my $saw_log_param = grep { $_ eq '$log' } @_;
        if ($saw_log_param) {
            __log_singleton(); # to init $log_singleton
            *{"$caller\::log"} = \$log_singleton;

sub get_logger {
    if (__log_enabled()) {
        require Log::Any;
        my $class = shift;
        if ($class eq 'Log::Any::IfLOG') {
        } else {
            Log::Any::get_logger($class, @_);
    } else {
        return __log_singleton();

sub new { my $o = ""; bless \$o, shift }
sub AUTOLOAD { 0 }

# ABSTRACT: Load Log::Any only if "logging is enabled"



=encoding UTF-8

=head1 NAME

Log::Any::IfLOG - Load Log::Any only if "logging is enabled"

=head1 VERSION

This document describes version 0.090 of Log::Any::IfLOG (from Perl distribution Log-Any-IfLOG), released on 2019-01-09.


 use Log::Any::IfLOG '$log';


This module is a drop-in replacement/wrapper for L<Log::Any> to be used from
your modules. This is a quick-hack solution to avoid the cost of loading
Log::Any under "normal condition". Since Log::Any 1.00, startup overhead
increases to about 7-10ms on my PC/laptop (from under 1ms for the previous
version). Because I want to keep startup overhead of CLI apps under 50ms (see
L<Perinci::CmdLine::Lite>) to keep tab completion from getting a noticeable lag,
every millisecond counts.

This module will only load L<Log::Any> when "logging is enabled". Otherwise, it
will just return without loading anything. If C<$log> is requested in import, a
fake object is returned that responds to methods like C<debug>, C<is_debug> and
so on but will do nothing when called and just return 0.

To determine "logging is enabled":


=item * Is $ENABLE_LOG defined?

This package variable can be used to force "logging enabled" (if true) or
"logging disabled" (if false). Normally, you don't need to do this except for

=item * Is Log::Any is already loaded (from %INC)?

If Log::Any is already loaded, it means we have taken the overhead hit anyway so
logging is enabled.

=item * Is one of log-related environment variables true?

If one of L<LOG>, C<TRACE>, or C<DEBUG>, or C<VERBOSE>, or C<QUIET>, or
C<LOG_LEVEL> is true then logging is enabled. These variables are used by

Otherwise, logging is disabled.


=for Pod::Coverage ^(.+)$


=head2 $ENABLE_LOG => bool

This setting can be forced to force loading Log::Any or not.


=head2 LOG => bool

=head2 TRACE => bool

=head2 DEBUG => bool

=head2 VERBOSE => bool

=head2 QUIET => bool

=head2 LOG_LEVEL => str


Please visit the project's homepage at L<>.

=head1 SOURCE

Source repository is at L<>.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired

=head1 SEE ALSO



=head1 AUTHOR

perlancar <>


This software is copyright (c) 2019, 2015 by

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.