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

Reply via email to