The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Name
    YOTE

Summary
    Yote is a platform for creating web based applications by bridging
    client side javascript with server side, automatically persistent perl
    objects. Yote provides javascript objects with methods that map to their
    server side counterparts. 

    Yote also is a simple web server as well as an app server.


Note
    As of this writing Yote is on version 0.1000.
    It is in alpha mode.
    Please email coyocanid@gmail.com to report bugs or issues or 
    feature requests.

Requirements
    *   perl version 5.10

Install Yote
	$ export INSTALL_BASE=/usr/local/yote #optional. default is /usr/local/yote
	$ export YOTEPORT=8008 #optional      #optional. default is 8008

	$ # Thru CPAN ---	

	$ cpan Yote

	$ #  OR ---
		
        $ perl Build.PL 
        $ ./Build
        $ ./Build test
        $ ./Build install

Verify by running html test
      $ yote_server
      open http://<myhost>/yote/unit_tests.html

Using Yote
  Start the Web App Server
    Starting the Web App Server from the command line:

           $ yote_server --port=8008 # default is port set up with, or 8008

    This starts the server on the default port (8008), using SQLiteIO, and
    writing to file ~/.yote/SQLite.yote.db.

    Starting the Web App Server from a package:

           use Yote::WebAppServer;

           my $server = new Yote::WebAppServer();

           $server->start_server( port       => 8008,
	                          webroot    => 'path/to/my/html/files', 
				  sqlitefile => 'yote.database_filename' );

  Coding with Yote
   Client Side
           <script src="/yote/js/jquery-latest.js"></script>
    	   <script src="/yote/js/jquery.dumper.js"></script>
     	   <script src="/yote/js/jquery.cookie.js"></script>
    	   <script src="/yote/js/jquery.base64.min.js"></script>
    	   <script src="/yote/js/json2.js"></script>
    	   <script src="/yote/js/yote.js"></script>
    	   <script src="/yote/js/yote.util.js"></script>
    	   <script src="/yote/js/yote.system.util.js"></script>
           <script>
	       $.yote.init();

	       /* Get the account root singleton object. */
               var hello_app = $.yote.fetch_app( 'Yote::Hello' );

	       /* Returns a string. If the method results in changes in other
	          javascript objects, those objects will automatically be updated. */
               var result = hello_app.hello( { name:"fred" } );

	       /* Returns a counter object */
               var counter = hello_app.get_counter();

	       alert( 'server said ' + result );
	       alert( 'counter in server has count of ' + counter.get_count() );
           </script>

   Server Side
        package Yote::Hello;

        use strict;
        use Yote::Obj;

	#
	# Any subclass of Yote::AppRoot will have a singleton instance in the Yote engine
	# that will be returned to the client with '$.yote.fetch_app( "app classname" )'.
	#
        use base 'Yote::AppRoot';

	#
	# Init is called only the very first time an Yote::AppRoot is instantiated. 
	# This is not called when this object is retreived from storage.
	#
        sub init {

            my $self = shift;

	    #
	    # 'get_counter' does not need an explicit definition. 
	    # A get_ method passed an argument will initialize the field if it is undefined.
	    #
            my $counter = $self->get_counter( new Yote::Obj() );

        } #init

	#
	# Any server side method takes 3 optional arguments on the client side :
	#       data, onSucceedFunction, onFailFunction
	#
	# Conversely, any server side method takes 3 automatically passed parameters :
	#    self, data, account.
	#
	#   The argument { name => "wilma" } is passed to the $data parameter of the method.
	#
	#   If a user is logged in to Yote on the client, that user's account will automatcially
	#    be passed into the server side method as the last argument. The account object is
	#    a Yote::Obj object meant to store any information specific to the user *and* this
	#    applications. A user will get a different account object for each different App.
 	#
        sub hello {

            my( $self, $data, $acct ) = @_;
            my $name = $data->{name};
            my $counter = $self->get_counter();

	    #
	    # 'set_count' does not need an explicit definition.
	    #
            $counter->set_count( $counter->get_count() + 1 );

	    #
	    # The return value is a string in this case.
	    # var msg = hello_app.hello({name:"foo"}); 
	    # msg will be the string "hello there 'foo'."
	    #
            return "hello there '$name'. I have said hello ". $counter->get_count() . " times.";

        } #hello

        1;