[1155] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[D-O-H] r1104 - trunk/owl/perl/lib/BarnOwl

daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:13:35 2009

Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@nelhage.com
To: dirty-owl-hackers@mit.edu
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Wed, 20 Aug 2008 02:16:36 -0400 (EDT)

Author: nelhage
Date: 2008-08-20 02:16:36 -0400 (Wed, 20 Aug 2008)
New Revision: 1104

Modified:
   trunk/owl/perl/lib/BarnOwl/ModuleLoader.pm
Log:
ModuleLoader.pm: Add a :reload command which reloads a single module


Modified: trunk/owl/perl/lib/BarnOwl/ModuleLoader.pm
===================================================================
--- trunk/owl/perl/lib/BarnOwl/ModuleLoader.pm	2008-08-20 06:16:30 UTC (rev 1103)
+++ trunk/owl/perl/lib/BarnOwl/ModuleLoader.pm	2008-08-20 06:16:36 UTC (rev 1104)
@@ -7,13 +7,29 @@
 use PAR (BarnOwl::get_data_dir() . "/modules/*.par");
 use PAR (BarnOwl::get_config_dir() . "/modules/*.par");
 
+our %modules;
+
 sub load_all {
+    my $class = shift;
+    $class->rescan_modules;
+
+    for my $mod (keys %modules) {
+        if(!defined eval "use BarnOwl::Module::$mod") {
+            BarnOwl::error("Unable to load module $mod: \n$@\n") if $@;
+        }
+    }
+
+    $BarnOwl::Hooks::startup->add(\&register_keybindings);
+}
+
+sub rescan_modules {
     PAR::reload_libs();
     PAR->import(BarnOwl::get_data_dir() . "/modules/*.par");
     PAR->import(BarnOwl::get_config_dir() . "/modules/*.par");
-    my %modules;
     my @modules;
 
+    %modules = ();
+
     my @moddirs = ();
     push @moddirs, BarnOwl::get_data_dir() . "/modules";
     push @moddirs, BarnOwl::get_config_dir() . "/modules";
@@ -36,22 +52,45 @@
             $modules{$class} = 1;
         }
     }
-    for my $class (keys %modules) {
-        if(!defined eval "use BarnOwl::Module::$class") {
-            # BarnOwl::error("Unable to load module $class: $!") if $!;
-            BarnOwl::error("Unable to load module $class: \n$@\n") if $@;
-        }
+}
+
+sub reload_module {
+    my $class = shift;
+    my $module = shift;
+
+    $class->rescan_modules();
+
+    for my $m (keys %INC) {
+        delete $INC{$m} if $m =~ m{^BarnOwl/Module/$module};
     }
 
-    $BarnOwl::Hooks::startup->add(\&register_keybindings);
+    local $SIG{__WARN__} = \&squelch_redefine;
+    if(!defined eval "use BarnOwl::Module::$module") {
+        BarnOwl::error("Unable to load module $module: \n$@\n") if $@;
+    }
 }
 
+sub reload_cmd {
+    my $class = shift;
+    shift; # Command
+    my $module = shift;
+    unless(defined($module)) {
+        die("Usage: reload [MODULE]");
+    };
+    $class->reload_module($module);
+}
+
 sub register_keybindings {
     BarnOwl::new_command('reload-modules', sub {BarnOwl::ModuleLoader->reload}, {
                            summary => 'Reload all modules',
                            usage   => 'reload-modules',
                            description => q{Reloads all modules located in ~/.owl/modules and the system modules directory}
                           });
+    BarnOwl::new_command('reload', sub {BarnOwl::ModuleLoader->reload_cmd(@_)}, {
+                           summary => 'Reload one module',
+                           usage   => 'reload [MODULE]',
+                           description => q{Reloads a single module located in ~/.owl/modules or the system modules directory}
+                          });
 }
 
 sub reload {


home help back first fref pref prev next nref lref last post