OpenSRF Application development API
-----------------------------------

OpenSRF offers a very simple Application development API to users of the
framework.  All that is required is to create a Perl module that subclasses
the OpenSRF::Application package and register it's methods with the
Method Dispatcher framework.

Each method executes in the OpenSRF::Application namespace as an instance of
the custom Application.  There are some instance methods on this object which
can be used by the method to alter the behavior or response that the method
sends to the client:

  $self->api_name  # returns the name of the method as called by the client

  $self->method    # returns the actual perl name of the sub implementing the
                   # method

  my $meth = $self->method_lookup( 'api_name' )
                   # constructs a new instance object implementing another
                   # method in the same Application package as a subrequest

  my ($subresult) = $meth->run( @params )
                   # runs the subrequest method and returns the array of
		   # results


The method is also handed an OpenSRF::AppRequest object that has been
constructed for the client request that generated the call to the method.
This OpenSRF::AppRequest object is used to communicate back to the client,
passing status messages or streaming response packets.

All that is required to register an Application with OpenSRF is to place a
setting in the configuration file that names the module that implements the
new Application, and to add the new Application's symbolic name to the list of
servers that should be started by OpenSRF.

   Example Application
   -------------------

  # Perl module and package implementing an math server.
  package MyMathServer;
  use OpenSRF::Application;
  use base 'OpenSRF::Application';

  sub do_math {
     my $self = shift;    # instance of MyMathServer
     
     my $client = shift;  # instance of OpenSRF::AppRequest connected
                          # to the client
     
     my $left_side = shift;
     my $op = shift;
     my $right_side = shift;
     
     return eval "$left_side $op $right_side";
  }

  __PACKAGE__->register_method(
     api_name => 'useless.do_math',
     argc => 3,
     method => 'do_math'
  );

  1;


  
  # Another Perl module and package implementing a square-root server on top
  # of the previous math server
  package MySquareRootServer;
  use OpenSRF::Application;
  use base 'OpenSRF::Application';
  use MyMathServer;

  sub sqrt_math {
     my $self = shift;    # instance of MySquareRootServer
     
     my $client = shift;  # instance of OpenSRF::AppRequest connected
                          # to the client
     
     my $math_method = $self->method_lookup('useless.do_math');
     my ($result) = $math_method->run( @_ );
     
     return sqrt( $result );
  }

  __PACKAGE__->register_method(
     api_name => 'simple.sqrt',
     argc => 3,
     method => 'sqrt_math'
  );

  1;

