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