Update of /cvsroot/fink/fink/perlmod/Fink In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv15702
Modified Files: Tag: selfupdate_classes ChangeLog SelfUpdate.pm Log Message: Clean up handling of plugins Index: SelfUpdate.pm =================================================================== RCS file: /cvsroot/fink/fink/perlmod/Fink/SelfUpdate.pm,v retrieving revision 1.117.2.17 retrieving revision 1.117.2.18 diff -u -d -r1.117.2.17 -r1.117.2.18 --- SelfUpdate.pm 21 Mar 2007 02:11:51 -0000 1.117.2.17 +++ SelfUpdate.pm 21 Mar 2007 03:00:45 -0000 1.117.2.18 @@ -116,9 +116,7 @@ $method = lc($method); my $prev_method = lc($config->param_default("SelfUpdateMethod", '')); - # find all Fink::SelfUpdate:: subclasses, skipping the base class - my @avail_subclasses = &find_subpackages(__PACKAGE__); - @avail_subclasses = grep { $_ ne __PACKAGE__.'::Base' } @avail_subclasses; + my @avail_subclasses = &Fink::SelfUpdate::_plugins; if ($method eq '') { # no explicit method requested @@ -129,9 +127,14 @@ } else { # no existing default so ask user + if ([EMAIL PROTECTED]) { + print_breaking_stderr("ERROR: No selfupdate methods implemented. Giving up.\n"); + return; + } + my @choices = (); # menu entries as ordered label=>class pairs my @default = (); # default menu choice (rsync if it's avail) - foreach my $subclass (sort @avail_subclasses) { + foreach my $subclass (@avail_subclasses) { push @choices, ( $subclass->description() => $subclass ); @default = ( 'value' => $subclass ) if &class2methodname($subclass) eq 'rsync'; } @@ -176,7 +179,7 @@ } # find the class that implements the method - my ($subclass_use) = grep { $_->method_name() eq $method } @avail_subclasses; + my ($subclass_use) = grep { &class2methodname($_) eq $method } @avail_subclasses; # sanity checks die "Selfupdate method '$method' is not implemented\n" unless( defined $subclass_use && length $subclass_use ); @@ -419,6 +422,47 @@ return lc($class); } +=item _plugins + + my $plugin_classes = Fink::SelfUpdate::_plugins; + +Returns a ref to a list of subclasses (by namespace) of the present +class that are subclasses (by inheritance) of the Base subclass. +Guaranteed that there is only one class with a given lowest-level name +(case-insentively). The returned list is sorted by that lowest-level +name. + +=cut + +{ + my $plugins; # cache the results + + sub _plugins { + if (!defined $plugins) { + my $base_class = __PACKAGE__ . '::Base'; + my %plugins = (); + foreach my $class (sort(find_subpackages(__PACKAGE__))) { + next if $class eq $base_class; # skip base class (dummy method) + + # lazy solution: require ISA relationship on base, so can + # know that all standard API are available + eval "require $class"; + next unless $class->isa($base_class); + + # name is the unique token, so eliminate dups + my $name = &class2methodname($class); + if (exists $plugins{$name}) { + # skip dups + print_breaking_stderr("WARNING: $name already supplied by $plugins{$name}; skipping $class\n"); + next; + } + $plugins{$name} = $class; + } + $plugins = [ map $plugins{$_}, sort keys %plugins ]; + } + return @$plugins; + } +} =back =cut Index: ChangeLog =================================================================== RCS file: /cvsroot/fink/fink/perlmod/Fink/ChangeLog,v retrieving revision 1.1439.2.23 retrieving revision 1.1439.2.24 diff -u -d -r1.1439.2.23 -r1.1439.2.24 --- ChangeLog 21 Mar 2007 02:11:51 -0000 1.1439.2.23 +++ ChangeLog 21 Mar 2007 03:00:44 -0000 1.1439.2.24 @@ -1,5 +1,9 @@ 2007-03-20 Daniel Macks <[EMAIL PROTECTED]> + * SelfUpdate.pm: Offload plugin-detection into _plugins function + +2007-03-20 Daniel Macks <[EMAIL PROTECTED]> + * SelfUpdate.pm, SelfUpdate/*: Rename desc_short() to description(); scrap the method_name() class method (always use lc(package-name)) ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Fink-commits mailing list Fink-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/fink-commits