AutoLoader nebo neco takoveho?

Honza Pazdziora adelton na fi.muni.cz
Čtvrtek Listopad 12 10:05:28 CET 2009


On Wed, Nov 11, 2009 at 10:01:53AM +0100, Jan Kasprzak wrote:
> 	Dobry den,
> 
> jakymi prostredky byste resili tento problem:
> 
> - mam program, ktery zpracovava ruzne typy dat (rekneme souboru). Pro
> kazdy typ souboru by mel mit metodu na zpracovani (treba: zpracuj_text_plain(),
> zpracuj_application_msword(), atd. A ja bych chtel aby implementace tech
> zpracovacich funkci byla v samostatnych souborech pojmenovanych na zaklade
> nazvu typu dat v nejakem samostatnem adresari. Aby kazdy typ mohl implementovat
> jiny programator, a taky aby nove typy bylo mozno pripadne pridat i bez
> restartu programu (ale toto uz neni nezbytne).
> 
> Jak byste to delali? Mit v PERL5LIB neco jako MujProgram/text_plain.pm
> a dalsi, pri startu programu projit adresar a "require" nacist vsechny
> moduly ktere tam jsou? Nebo nejaky autoloader? Nebo?

Ani neni nutne pri startu, proste require v okamziku pouziti. Kdyz se
podivas treba na LWP::Protocol, tak tam je

    return '' unless $scheme =~ /^([.+\-\w]+)$/;  # check valid URL schemes
    $scheme = $1; # untaint
    $scheme =~ s/[.+\-]/_/g;  # make it a legal module name

    # scheme not yet known, look for a 'use'd implementation
    $ic = "LWP::Protocol::$scheme";  # default location
    $ic = "LWP::Protocol::nntp" if $scheme eq 'news'; #XXX ugly hack
    no strict 'refs';
    # check we actually have one for the scheme:
    unless (@{"${ic}::ISA"}) {
        # try to autoload it
        eval "require $ic";
        if ($@) {
            if ($@ =~ /Can't locate/) { #' #emacs get confused by '
                $ic = '';
            }
            else {
                die "$@\n";
            }
        }
    }
    $ImplementedBy{$scheme} = $ic if $ic;

-- 
--------------------------------------------------------------------------
  Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Satellite, Spacewalk | Only self-confident people can be simple.


Další informace o konferenci Perl