Provided by: libje-perl_0.066-4_all 

NAME
JE::Object::Function - JavaScript function class
SYNOPSIS
use JE::Object::Function;
# simple constructors:
$f = new JE::Object::Function $scope, @argnames, $function;
$f = new JE::Object::Function $scope, $function;
# constructor that lets you do anything:
$f = new JE::Object::Function {
name => $name,
scope => $scope,
length => $number_of_args,
argnames => [ @argnames ],
function => $function,
function_args => [ $arglist ],
constructor => sub { ... },
constructor_args => [ $arglist ],
downgrade => 0,
};
$f->(@args);
$f->call_with($obj, @args);
DESCRIPTION
All JavaScript functions are instances of this class. If you want to call a JavaScript function from
Perl, just treat is as a coderef ("$f->()") or use the "call_with" method ("$f->call_with($obj, @args)")
if you want to specify the invocant (the 'this' value).
OBJECT CREATION
new Creates and returns a new function (see the next few items for its usage). The new function will
have a "prototype" property that is an object with a "constructor" property that refers to the
function itself.
The return value of the function will be upgraded if necessary (see UPGRADING VALUES in the JE::Types
man page), which is why "new" has to be given a reference to the global object or the scope chain.
(But see also "new_function" in JE and "new_method" in JE.)
A function written in Perl can return an lvalue if it wants to. Use
"new JE::LValue($object, 'property name')" to create it. To create an lvalue that refers to a
variable visible within the function's scope, use "$scope->var('varname')" (this assumes that you
have shifted the scope object off @_ and called it $scope; you also need to call "new" with hashref
syntax and specify the "function_args" [see below]).
new JE::Object::Function $scope_or_global, @argnames, $function;
new JE::Object::Function $scope_or_global, $function;
$scope_or_global is one of the following:
- a global (JE) object
- a scope chain (JE::Scope) object
@argnames is a list of argument names, that JavaScript functions use to access the arguments.
$function is one of
- a string containing the body of the function (JavaScript code)
- a JE::Code object
- a coderef
new JE::Object::Function { ... };
This is the big fancy way of creating a function that lets you do anything. The elements of the hash
ref passed to "new" are as follows (they are all optional, except for "scope"):
name
The name of the function. This is used only by "toString".
scope
A global object or scope chain object.
length
The number of arguments expected. If this is omitted, the number of elements of "argnames" will
be used. If that is omitted, 0 will be used. Note that this does not cause the argument list to
be checked. It only provides the "length" property (and possibly, later, an "arity" property) for
inquisitive scripts to look at.
argnames
An array ref containing the variable names that a JS function uses to access the arguments.
function
A coderef, string of JS code or JE::Code object (the body of the function).
This will be run when the function is called from JavaScript without the "new" keyword, or from
Perl via the "call" method.
function_args
This only applies when "function" is a code ref. "function_args" is an array ref, the elements
being strings that indicated what arguments should be passed to the Perl subroutine. The strings,
and what they mean, are as follows:
self the function object itself
scope the scope chain
global the global object
this the invocant
args the arguments passed to the function (as individual
arguments)
[args] the arguments passed to the function (as an array ref)
If "function_args" is omitted, 'args' will be assumed.
constructor
A code ref that creates and initialises a new object. This is called when the "new" keyword is
used in JavaScript, or when the "construct" method is used in Perl.
If this is omitted, when "new" or "construct" is used, a new empty object will be created and
passed to the sub specified under "function" as its 'this' value. The return value of the sub
will be returned if it is an object; the (possibly modified) object originally passed to the
function will be returned otherwise.
constructor_args
Like "function_args", but the 'this' string does not apply. If "constructor_args" is omitted, the
arg list will be set to "[ qw( scope args ) ]" (this might change).
This is completely ignored if "constructor" is omitted.
downgrade (not yet implemented)
This applies only when "function" or "constructor" is a code ref. This is a boolean indicating
whether the arguments to the function should have their "value" methods called automatically.;
i.e., as though "map $_->value, @args" were used instead of @args.
no_proto
If this is set to true, the returned function will have no "prototype" property.
METHODS
new JE::Object::Function
See "OBJECT CREATION".
call_with ( $obj, @args )
Calls a function with the given arguments. The $obj becomes the function's invocant. This method is
intended for general use from the Perl side. The arguments (including $obj) are automatically
upgraded.
call ( @args )
This method, intended mainly for internal use, calls a function with the given arguments, without
upgrading them. The invocant (the 'this' value) will be the global object. This is just a wrapper
around "apply".
This method is very badly named and will probably be renamed in a future version. Does anyone have
any suggestions?
construct
This method, likewise intended mainly for internal use, calls the constructor, if this function has
one (functions written in JS don't have this). Otherwise, an object will be created and passed to the
function as its invocant. The return value of the function will be discarded, and the object
(possibly modified) will be returned instead.
apply ( $obj, @args )
This method, intended mainly for internal use just like the two above, calls the function with $obj
as the invocant and @args as the args. No upgrading occurs.
This method is very badly named and will probably be renamed in a future version. Does anyone have
any suggestions?
typeof
This returns the string 'function'.
class
This returns the string 'Function'.
value
Not yet implemented.
OVERLOADING
You can use a JE::Object::Function as a coderef. The sub returned simply invokes the "call" method, so
the following are equivalent:
$function->call( $function->global->upgrade(@args) )
$function->(@args)
The stringification, numification, boolification, and hash dereference ops are also overloaded. See
JE::Object, which this class inherits from.
SEE ALSO
JE
JE::Object
JE::Types
JE::Scope
JE::LValue
perl v5.36.0 2023-08-25 JE::Object::Function(3pm)