import of rt 3.0.4
[freeside.git] / rt / html / Elements / Callback
diff --git a/rt/html/Elements/Callback b/rt/html/Elements/Callback
new file mode 100644 (file)
index 0000000..93ac4c0
--- /dev/null
@@ -0,0 +1,65 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%# 
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+<%once>
+my (%cache, $check);
+</%once>
+<%init>
+# checks for inode change time for each callback directory
+my $new_check = join(
+    $;, map { $_->[1] => (stat("$_->[1]/Callbacks"))[10] } $m->interp->resolver->comp_root_array
+) or return;
+
+$Page = $m->callers(1)->path unless ($Page);
+
+my $callbacks;
+if ($new_check eq $check) {
+    $callbacks = $cache{$Page,$_CallbackName};
+}
+else {
+    $check = $new_check;
+}
+
+if (!$callbacks) {
+    my $path = "/Callbacks/*$Page/$_CallbackName";
+    $callbacks = [ $m->interp->resolver->glob_path($path) ];
+    @$callbacks = grep !/^\.|~$/, @$callbacks; #skip backup files
+
+    #skip files without a package
+    my $invalid_base = "/Callbacks/$Page/$_CallbackName";
+    @$callbacks = grep !/^$invalid_base$/, @$callbacks;
+
+
+
+    $cache{$Page,$_CallbackName} = $callbacks;
+}
+
+foreach my $comp (@$callbacks) {
+        $m->comp($comp, %ARGS) if $m->comp_exists($comp);
+}
+return(1);
+</%init>
+<%args>
+$_CallbackName => 'Default'
+$Page => undef
+</%args>