ClientAPI
[freeside.git] / FS / FS / ClientAPI.pm
diff --git a/FS/FS/ClientAPI.pm b/FS/FS/ClientAPI.pm
new file mode 100644 (file)
index 0000000..f7b8eb0
--- /dev/null
@@ -0,0 +1,44 @@
+package FS::ClientAPI;
+
+use strict;
+use vars qw(%handler);
+
+%handler = ();
+
+#find modules
+foreach my $INC ( @INC ) {
+  foreach my $file ( glob("$INC/FS/ClientAPI/*") ) {
+    $file =~ /\/(\w+)\.pm$/ or do {
+      warn "unrecognized ClientAPI file: $file";
+      next
+    };
+    my $mod = $1;
+    #warn "using FS::ClientAPI::$mod";
+    eval "use FS::ClientAPI::$mod;";
+    die "error using FS::ClientAPI::$mod: $@" if $@;
+  }
+}
+
+#(sub for modules)
+sub register_handlers {
+  my $self = shift;
+  my %new_handlers = @_;
+  foreach my $key ( keys %new_handlers ) {
+    warn "WARNING: redefining sub $key" if exists $handler{$key};
+    #warn "registering $key";
+    $handler{$key} = $new_handlers{$key};
+  }
+}
+
+#---
+
+sub dispatch {
+  my ( $self, $name ) = ( shift, shift );
+  my $sub = $handler{$name}
+    or die "unknown FS::ClientAPI sub $name (known: ". join(" ", keys %handler );
+    #or die "unknown FS::ClientAPI sub $name";
+  &{$sub}(@_);
+}
+
+1;
+