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


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


       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 = $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)

             $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.

             @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.


           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()


           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,

           It uses %INC.


             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.


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

       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.


           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;

           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;

           package main;

           my $obj = bless({},'MySubClass');


       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 1;

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

   Messaging Methods
             @types = UR::ModuleBase->message_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:

               $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".

               $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".

               $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.

               $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.

               @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.

               $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

               %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.

           These methods return the same data as $obj->error_message_source().