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

NAME

JSPL::Stash - Perl namespaces reflector for JavaScript.

DESCRIPTION

Every perl namespace when exposed to JavaScript either automatically or by the methods of the JSPL::Controller perl class is represented by an instance of a Stash.

In perl a particular namespace can be used for different things. From simply to collect a bunch of variables and subroutines, to implement a complete class, or can act as a class "broker" when its static methods are constructors for other classes. The ways in which you can use Stash instances in javascript are different too.

In fact a perl namespace can be exposed to javascript without binding the associated Stash instance into any property in your global object, making it invisible and its use transparent. That whats happens when a perl object enters javascript land and you call its instance methods.

Javascript interface

TBD

Perl interface

The value returned by "add" in JSPL::Controller and Stash instances entering perl land are wrapped as JSPL::Stash objects.

    my $ctl = $ctx->get_controller;
    my $stash = $ctl->add('DBI'); # Expose to js the package 'DBI'.

Instance methods

allow_from_js ( [ BOOLEAN ] )
    my $old = $stash->allow_from_js($bool);

Call this with a TRUE value to allow javascript code to make changes to the associated perl namespace. All namespaces are, by default, not modifiable from javascript. Returns the previous state of the flag.

For example:

    # Expose the namespace 'ForJSUse'
    my $stash = $ctl->add('ForJSuse');
    # Make 'ForJSUse' modifiable by js code
    $stash->allow_from_js(1);
class_bind ( BIND_POINT )
    $stash->class_bind($prop_name);

Make the package visible in javascript as a class under the given property BIND_POINT.

For example:

    require 'DBI';
    $ctl->add('DBI')->class_bind('DBI');

Exposes the perl package 'DBI' and binds it to the property of the same name as a class, allowing to call its methods as static ones.

package_bind ( BIND_POINT )
    $stash->package_bind($prop_name);

Make the package visible in javascript as a simple collection of values (normally soubroutines) under the property BIND_POINT.

For example:

    require 'POSIX';
    $ctl->add('POSIX')->package_bind('POSIX');

So you can call any subroutine in package 'POSIX' from javascript:

    // In javascript land
    var fd = POSIX.open('foo', POSIX.O_RDONLY());
    // Yes, fd is a real file descriptor
    POSIX.lseek(fd, 0, POSIX.SEEK_SET())
    ...
    POSIX.close(fd);
set_constructor ( )
set_constructor ( CODE )
set_constructor ( SUB_NAME )

TBD

add_properties

TBD