+sub hook (@) { # {{{
+ my %param=@_;
+
+ if (! exists $param{type} || ! ref $param{call} || ! exists $param{id}) {
+ error "hook requires type, call, and id parameters";
+ }
+
+ $hooks{$param{type}}{$param{id}}=\%param;
+} # }}}
+
+sub run_hooks ($$) { # {{{
+ # Calls the given sub for each hook of the given type,
+ # passing it the hook function to call.
+ my $type=shift;
+ my $sub=shift;
+
+ if (exists $hooks{$type}) {
+ foreach my $id (keys %{$hooks{$type}}) {
+ $sub->($hooks{$type}{$id}{call});
+ }
+ }
+} #}}}
+
+sub globlist_to_pagespec ($) { #{{{
+ my @globlist=split(' ', shift);
+
+ my (@spec, @skip);
+ foreach my $glob (@globlist) {
+ if ($glob=~/^!(.*)/) {
+ push @skip, $glob;
+ }
+ else {
+ push @spec, $glob;
+ }
+ }