# -*- mode: org -*-

#
#+TODO: TODO BLOCKED | DONE CANCELED
#
#+TITLE: TODO items for Log::Fine
#+AUTHOR: Christopher M. Fuhrman

* DONE [#B] Rename Template->_templateValidate()                  :templates:
  CLOSED: [2011-12-02 Fri 12:51]
  - CLOSING NOTE [2011-12-02 Fri 12:52] \\
    Completed.  =_templateValidate()= has been replaced with
    =_placeholderValidate()=

  Rename =Template->_templateValidate()= to some other method name
  that has the word 'placeholder' in it.

* CANCELED [#C] Create Log::Fine::Handle::SMTP                      :handles:
  CLOSED: [2012-05-29 Tue 17:10]
  - CLOSING NOTE [2012-05-29 Tue 17:11] \\
    Canceled.  I'm going to subclass this instead.

  Create a new handle for simple email delivery.  This method will use
  the standard Net::SMTP module for email delivery rather than the
  fully-featured Email::Sender module.

* CANCELED [#A] Re-organize Log::Fine::Handle::Email functionality
  CLOSED: [2012-07-16 Mon 17:06]
  - CLOSING NOTE [2012-07-16 Mon 17:07] \\
    Will not implement

  This would work as follows:

  1) User would instantiate a Log::Fine::Handle::Email object,
     optionally passing it the name of the submodule to load

  2) Email handle would then determine the appropriate class to load
     and return the appropriate instance

  3) Note that the default will remain using the Email::Sender module
     for email delivery since it's the most flexible

** Minor API change

    - Addition of hash item "module" to constructor for specifying
      Email module to use. Default will be EmailSender.

    - =msgWrite()= must now be subclassed.

* DONE [#C] Brainstorm ideas for LOGFINE-0-61                    :brainstorm:
  CLOSED: [2012-07-16 Mon 17:07]
  - CLOSING NOTE [2012-07-16 Mon 17:07] \\
    Done

  Ideally, I'd like to get Log::Fine "enterprise-ready", by adding a
  number of features and improvements aimed at stability

** CANCELED [#C] Allow for Handle enabling/disabling
   CLOSED: [2012-06-19 Tue 21:32]
   - CLOSING NOTE [2012-06-19 Tue 21:33] \\
     Holding off this functionality as it would require an API change which
     I am loathe to do.  Also, do people really need this functionality?

   This would involve the addition of the following methods to
   =Handle.pm=:

    - =enable()=

    - =disable()=

   To facilitate this, a Logger object must be able to reference a
   handle by name, so the following changes would have to be made to
   =Logger.pm=:

    1) Add new method, =handleByName()= for retrieving a handle by its
       name.  Would take a string representing a handle name.  If it
       can't find the associated handle, then return undef.

    2) Add new method, =listHandles()= for retrieving a list of
       registered handles.

    3) Optionally, just tell the user to keep track of handle names on
       their own.

    Also, =isLoggable()= would have to handle enabled or disabled
    handles.

** CANCELED [#A] Add internal logging method
   CLOSED: [2012-06-20 Wed 10:18]
   - CLOSING NOTE [2012-06-20 Wed 10:23] \\
     Will not implement.  I'm going to simply rely on sending messages to
     STDERR.

   Add the ability for Log::Fine to log itself.  By default, use a new
   handle, =Null= and log to that (any logging there goes into the
   ether).  The user can specify one or more handles on construction,
   like so:

   #+BEGIN_SRC perl
   use Log::Fine;
   use Log::Fine::Handle::Console;
   use Log::Fine::Levels::Syslog qw( :masks );

   my $loghandle =
       Log::Fine::Handle::Console->new(
           name => 'logfine_logger',
           mask => LOGMASK_EMERG | LOGMASK_ALERT | LOGMASK_CRIT,
           use_stderr => 1,
       );

   my $log = Log::Fine->new(int_log_handle => [ $loghandle ]);
   #+END_SRC

   This would create a new internal logger object.

*** DONE Create Null handle
    CLOSED: [2012-06-19 Tue 22:19]
    - CLOSING NOTE [2012-06-19 Tue 22:19] \\
      Done.  See [[https://github.com/cfuhrman/log-fine/commit/d8cea7efcff4a8735d65726a404c27bb14d3bebb][d8cea7e]].

    Create Null handle which will be the default internal logging
    handle

** DONE [#B] Have =registerHandle()= accept more than one Handles
   CLOSED: [2012-06-18 Mon 22:53]
   - CLOSING NOTE [2012-06-18 Mon 22:54] \\
     Added in [[https://github.com/cfuhrman/log-fine/commit/7d4cd749c9b49e94b079511bae30c40aceb25d11#lib/Log/Fine/Logger.pm][7d4cd74]]

   Just need to have =registerHandle()= check to see if it's being fed
   an array ref and then make sure all elements in that array are
   =Handle= objects.

** DONE [#A] Check File Handles in =Handle::File= objects
   CLOSED: [2012-06-18 Mon 22:56]
   - CLOSING NOTE [2012-06-18 Mon 22:56] \\
     File handles are now checked in [[https://github.com/cfuhrman/log-fine/commit/83192fa5e631daac1310715e05aaea2e51d30a94#lib/Log/Fine/Handle/File.pm][83192fa]]

   Need to make sure we can print and whatnot in =Handle::File=
   objects.  Might also want to make sure directory exists before we
   instantiate.

** DONE [#C] Make =Sys::Syslog= testing optional
   CLOSED: [2012-06-28 Thu 13:28]
   - CLOSING NOTE [2012-06-28 Thu 13:29] \\
     Done.  See [[https://github.com/cfuhrman/log-fine/commit/fa339e5c23fc36238fe39b43bcb617f503c173fe][fa339e5]].

   Make =Sys::Syslog= testing optional.  This way, I can test
   =Log::Fine= on some systems where =Sys::Syslog= is either not
   installed or older than version 0.13 (which is the minimally
   required version for =Log::Fine=).

** DONE [#A] Add =_error()= method
   CLOSED: [2012-06-18 Mon 22:56]
   - CLOSING NOTE [2012-06-18 Mon 22:57] \\
     =_error()= added in [[https://github.com/cfuhrman/log-fine/commit/83192fa5e631daac1310715e05aaea2e51d30a94#lib/Log/Fine/Handle/File.pm][83192fa]]

   By default, =_error()= method will call =_fatal()=.

** DONE [#A] Replace =MIME::Lite=                                   :handles:
   CLOSED: [2012-06-28 Thu 13:25]
   - CLOSING NOTE [2012-06-28 Thu 13:27] \\
     I've completely stripped out Email Handle subclassing, so it's safe to
     close this task.  Email::Sender seems to be robust enough for most use
     cases so continue to use that.

   MIME::Lite is no longer maintained[fn:1], so need to use another
   perl module instead.  I'll need to find an appropriate module that
   meets the following criteria:

    1) Compatible with perl v5.6.0

    2) Fairly lightweight

   Another option is to strip out the Email subclassing entirely and
   go back to using only Email::Sender.

*** Candidates

     - [[http://search.cpan.org/=markov/MailTools-2.09/lib/Mail/Send.pod][Mail::Send]]

     - [[http://search.cpan.org/=jenda/Mail-Sender-0.8.21/Sender.pm][Mail::Sender]]

** CANCELED [#B] Optimize =msgWrite()= where appropriate            :handles:
   CLOSED: [2012-06-21 Thu 11:15]
   - CLOSING NOTE [2012-06-21 Thu 11:17] \\
     Originally, I intended to replace instances such as these:
     
         #+BEGIN_SRC perl
         my $self = shift;
         my $lvl  = shift;
         my $msg  = shift;
         my $skip = shift;
         #+END_SRC
     
     with
     
         #+BEGIN_SRC perl
         my ($self, $lvl, $msg, $skip) = @_;
         #+END_SRC

     But speed testing indicates that there is more of a speed penalty with
     using the =@_= notation than simply making multiple calls to =shift()=, so
     no need to optimize


* DONE Use TEMP environment variable under Windows                  :testing:
  CLOSED: [2013-04-30 Tue 10:39]
  - CLOSING NOTE [2013-04-30 Tue 10:39] \\
    Done.  To be released in LOGFINE-0-64

  =17-handle-file-windows.t= :: Use the environmental variable TEMP
  for determining path of TEMP directory under MS Windows

* DONE Find out why tests are leaving files behind
  CLOSED: [2013-09-17 Tue 11:51]
  - CLOSING NOTE [2013-09-17 Tue 11:51] \\
    Done.  The files were left over by some previous code that was never
    committed

  Apparently, when =make test= is run, files are left behind.  All
  good boys must clean up after themselves!

* DONE Use flexible Mail::RFC822::Address
  CLOSED: [2013-12-20 Fri 20:44]
  - CLOSING NOTE [2013-12-20 Fri 20:44] \\
    Added support for flexible loading of Mail::RFC822::Address

   - Put some logic behind email address validation

* DONE Add CAVEAT about Email::Valid
  CLOSED: [2013-12-21 Sat 11:04]
  - CLOSING NOTE [2013-12-21 Sat 11:04] \\
    Done.
* Footnotes

[fn:1] http://search.cpan.org/=rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm#WAIT!
