Provided by: libur-perl_0.470+ds-2_all bug

NAME

       UR::ModuleBase - Methods common to all UR classes and object instances.

DESCRIPTION

       This is a base class for packages, classes, and objects which need to manage basic functionality in the
       UR framework such as inheritance, AUTOLOAD/AUTOSUB methods, error/status/warning/etc messages.

       UR::ModuleBase is in the @ISA list for UR::Object, but UR::ModuleBase is not a formal UR class.

METHODS

       "class"
             $class = $obj->class;

           This returns the class name of a class or an object as a string.  It is exactly equivalent to:

               (ref($self) ? ref($self) : $self)

       "super_can"
             $sub_ref = $obj->super_can('func');

           This  method determines if any of the super classes of the $obj object can perform the method "func".
           If any one of them can, reference to the subroutine that would be called (determined using  a  depth-
           first  search  of  the  @ISA array) is returned.  If none of the super classes provide a method named
           "func", "undef" is returned.

       "inheritance"
             @classes = $obj->inheritance;

           This method returns a depth-first list of all the classes (packages) that the  class  that  $obj  was
           blessed into inherits from.  This order is the same order as is searched when searching for inherited
           methods  to  execute.  If the class has no super classes, an empty list is returned.  The "UNIVERSAL"
           class is not returned unless explicitly put into the @ISA array by the class  or  one  of  its  super
           classes.

       "parent_classes"
             MyClass->parent_classes;

           This  returns  the immediate parent class, or parent classes in the case of multiple inheritance.  In
           no case does it follow the inheritance hierarchy as ->inheritance() does.

       "base_dir"
             MyModule->base_dir;

           This returns the base directory for a given module, in which the modules's supplemental data will  be
           stored, such as config files and glade files, data caches, etc.

           It uses %INC.

       methods
           Undocumented.

       "context_return"
             return MyClass->context_return(@return_values);

           Attempts  to  return  either  an array or scalar based on the calling context.  Will die if called in
           scalar context and @return_values has more than 1 element.

AUTOLOAD"

       This package implements AUTOLOAD so that derived classes can use AUTOSUB instead of AUTOLOAD.

       When a class or object has a method called which is not found in the final class or any derived  classes,
       perl  checks up the tree for AUTOLOAD.  We implement AUTOLOAD at the top of the tree, and then check each
       class in the tree in order for an AUTOSUB method.  Where a class implements AUTOSUB, it  will  receive  a
       function  name  as  its  first  parameter, and it is expected to return either a subroutine reference, or
       undef.  If undef is returned then the inheritance tree search will continue.  If a  subroutine  reference
       is returned it will be executed immediately with the @_ passed into AUTOLOAD.  Typically, AUTOSUB will be
       used  to  generate  a  subroutine reference, and will then associate the subref with the function name to
       avoid repeated calls to AUTOLOAD and AUTOSUB.

       Why not use AUTOLOAD directly in place of AUTOSUB?

       On an object with a complex inheritance tree, AUTOLOAD is only found once, after which, there is  no  way
       to  indicate  that  the  given AUTOLOAD has failed and that the inheritance tree trek should continue for
       other AUTOLOADS which might implement the given method.

       Example:

           package MyClass;
           our @ISA = ('UR');
           ##- use UR;

           sub AUTOSUB
           {
               my $sub_name = shift;
               if ($sub_name eq 'foo')
               {
                   *MyClass::foo = sub { print "Calling MyClass::foo()\n" };
                   return \&MyClass::foo;
               }
               elsif ($sub_name eq 'bar')
               {
                   *MyClass::bar = sub { print "Calling MyClass::bar()\n" };
                   return \&MyClass::bar;
               }
               else
               {
                   return;
               }
           }

           package MySubClass;
           our @ISA = ('MyClass');

           sub AUTOSUB
           {
               my $sub_name = shift;
               if ($sub_name eq 'baz')
               {
                   *MyClass::baz = sub { print "Calling MyClass::baz()\n" };
                   return \&MyClass::baz;
               }
               else
               {
                   return;
               }
           }

           package main;

           my $obj = bless({},'MySubClass');
           $obj->foo;
           $obj->bar;
           $obj->baz;

MESSAGING

       UR::ModuleBase implements several methods for sending and storing error, warning and status  messages  to
       the user.

         # common usage

         sub foo {
             my $self = shift;
             ...
             if ($problem) {
                 $self->error_message("Something went wrong...");
                 return;
             }
             return 1;
         }

         unless ($obj->foo) {
             print LOG $obj->error_message();
         }

   Messaging Methods
       message_types
             @types = UR::ModuleBase->message_types;
             UR::ModuleBase->message_types(@more_types);

           With  no  arguments,  this  method  returns  all the types of messages that this class handles.  With
           arguments, it adds a new type to the list.

           Standard message types are fatal, error, status, warning, debug and usage.

           Note that the addition of new types is not fully supported/implemented yet.

       For each message type, several methods are created for sending and  retrieving  messages,  registering  a
       callback to run when messages are sent, controlling whether the messages are printed on the terminal, and
       whether the messages are queued up.

       For example, for the "error" message type, these methods are created:

       error_message
               $obj->error_message("Something went wrong...");
               $obj->error_message($format, @list);
               $msg = $obj->error_message();

           When   called  with  one  or  more  arguments,  it  sends  an  error  message  to  the  object.   The
           error_message_callback will be run, if one is registered, and the message  will  be  printed  to  the
           terminal.   When  given a single argument, it will be passed through unmodified.  When given multiple
           arguments, error_message will assume the first is a format string and the remainder are parameters to
           sprintf.  When called with no arguments, the last message sent will be returned.  If the  message  is
           "undef"  then no message is printed or queued, and the next time error_message is run as an accessor,
           it will return undef.

           Note that "fatal_message()" will throw an exception at the point it appears  in  the  program.   This
           exception, like others, is trappable bi "eval".

       dump_error_messages
               $obj->dump_error_messages(0);
               $flag = $obj->dump_error_messages();

           Get  or  set  the  flag  which controls whether messages sent via "error_message()" is printed to the
           terminal.  This flag defaults to true for warning and error messages, and false for others.

           Note   that   "fatal_message()"   messages   and   exceptions   do   not   honor   the    value    of
           "dump_fatal_messages()", and always print their message and throw their exception unless trapped with
           an "eval".

       queue_error_messages
               $obj->queue_error_messages(0);
               $flag = $obj->queue_error_messages();

           Get  or set the flag which control whether messages send via "error_message()" are saved into a list.
           If  true,  every  message  sent  is  saved  and   can   be   retrieved   with   error_messages()   or
           error_messages_arrayref().  This flag defaults to false for all message types.

       error_messages_callback
               $obj->error_messages_callback($subref);
               $subref = $obj->error_messages_callback();

           Get  or  set  the  callback  run  whenever  an  error_message is sent.  This callback is run with two
           arguments: The object or class error_message() was called on, and a string  containing  the  message.
           This  callback  is  run  before  the message is printed to the terminal or queued into its list.  The
           callback can modify the message (by writing to $_[1]) and affect  the  message  that  is  printed  or
           queued.   If  $_[1]  is  set  to "undef", then no message is printed or queued, and the last recorded
           message is set to undef as when calling error_message with undef as the argument.

       error_messages
               @list = $obj->error_messages();

           If the queue_error_messages flag is on, then this method returns the entire list of queued messages.

           When called as an instance method, it returns the errors queued only on that object.  When called  as
           a class method, it returns the errors queued on that class, all it's subclasses, and all instances of
           that class or subclasses.

       error_messages_arrayref
               $listref = $obj->error_messages_arrayref();

           If the queue_error_messages flag is on, then this method returns a reference to the actual list where
           messages get queued.  This list can be manipulated to add or remove items.

       error_message_source
               %source_info = $obj->error_message_source

           Returns  a  hash of information about the most recent call to error_message.  The key "error_message"
           contains the message.  The keys error_package, error_file, error_line  and  error_subroutine  contain
           info about the location in the code where error_message() was called.

       error_package
       error_file
       error_line
       error_subroutine
           These methods return the same data as $obj->error_message_source().

SEE ALSO

       UR(3)

perl v5.32.1                                       2022-01-17                                UR::ModuleBase(3pm)