]> git.vpit.fr Git - perl/scripts/xchat.git/blobdiff - Xchat/XPI/Utils.pm
Add better context handling helpers
[perl/scripts/xchat.git] / Xchat / XPI / Utils.pm
index 82699db9ca405de9aa5b76e71e7b98ccc655524a..ad99f0ff0162b140e40634d560a0c4a1d7fc49df 100644 (file)
@@ -23,10 +23,35 @@ sub dye_nick {
  return sprintf "\003%d%s", $rcolors[$col % @rcolors], $nick;
 }
 
  return sprintf "\003%d%s", $rcolors[$col % @rcolors], $nick;
 }
 
+sub save_context {
+ my $cur_cxt = get_context;
+ bless \$cur_cxt, 'Xchat::XPI::Utils::ContextGuard';
+}
+
+sub local_context {
+ return unless @_ >= 2;
+ my $code    = pop;
+ my $new_cxt = (@_ == 1) ? $_[0] : find_context(@_);
+ my $cur_cxt = get_context;
+ if (set_context $new_cxt) {
+  my $guard = bless \$cur_cxt, 'Xchat::XPI::Utils::ContextGuard';
+  return $code->();
+ } else {
+  return undef;
+ }
+}
+
+sub Xchat::XPI::Utils::ContextGuard::DESTROY {
+ set_context ${$_[0]};
+}
+
 use base qw<Exporter>;
 
 our @EXPORT         = ();
 use base qw<Exporter>;
 
 our @EXPORT         = ();
-our %EXPORT_TAGS    = ('funcs' => [ qw<dye_nick> ]);
+our %EXPORT_TAGS    = ('funcs' => [ qw<
+ dye_nick
+ save_context local_context
+> ]);
 our @EXPORT_OK      = map { @$_ } values %EXPORT_TAGS;
 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];
 
 our @EXPORT_OK      = map { @$_ } values %EXPORT_TAGS;
 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];