From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

# XML::Axk::Language - common definitions for axk language modules (X::A::Ln).
use XML::Axk::Base ':all';
use vars;
#use Devel::StackTrace;
# Registry mapping XALn package names to arrayrefs of the script parameters
# (SPs) for those packages.
#our %SP_Registry = ();
# Export ========================================================= {{{1
sub import {
my $class = shift;
my $lang = caller;
if($class ne __PACKAGE__) { # do I need this?
confess(__PACKAGE__ . " initializer called from class $class");
}
#say "XALanguage run from $target:\n", Devel::StackTrace->new->as_string;
# Set up the registry
#$SP_Registry{$lang} = [] unless exists $SP_Registry{$lang};
#my $lrRegistry = $SP_Registry{$lang};
my %opts = ( $#_>0 && $#_ ? @_ : () ); # even number of args => options
my (@sps, $drUpdater); # option values for sp, updater
my $sandbox; # _AxkSandbox in the target, if any
# sp: populate the registry with the given variables.
if(exists $opts{sp} && $opts{sp}) {
croak "Need an arrayref for the SPs" unless ref $opts{sp} eq 'ARRAY';
@sps = @{$opts{sp}};
} #`sp` option
# updater: the function that updates the SPs each record
if(exists $opts{updater} && $opts{updater}) {
croak "Need a code ref for the SPs" unless ref $opts{updater} eq 'CODE';
# TODO permit methods?
$drUpdater = $opts{updater};
} #`sp` option
# target: mark the given axk_script (if any)
if(exists $opts{target} && $opts{target}) {
my $target = $opts{target};
my $sandboxname = "${target}::_AxkSandbox";
#say "Loading $varname with $lang";
do {
no strict 'refs';
#croak "A script can only use one language" if defined $$varname;
$sandbox = $$sandboxname if defined $$sandboxname;
};
# Inject the script parameters
if(@sps) {
vars->import::into($target, @sps); # Create the SP vars...
if($sandbox) { # ... then link them to storage in the core.
$sandbox->allocate_sps($lang, @sps);
$sandbox->inject_var($lang, $_) for @sps;
}
}
# Set the updater.
if($sandbox && $drUpdater) {
$sandbox->set_updater($lang, $drUpdater);
}
} #`target` option
} #import()
# }}}1
1;
# === Documentation ===================================================== {{{2
__END__
=pod
=encoding UTF-8
=head1 NAME
XML::Axk::Language - base language code for the axk XML processor
=head1 VERSION
Version 0.01
=head1 USAGE
When implementing a language:
require XML::Axk::Language;
sub import {
XML::Axk::Language->import( target => caller, sp => [qw($foo @bar)],
updater => sub { ... } );
}
=head1 OPTIONS
C<target>: the name of the package to load the script parameters (SPs) into
C<sp>: the list of script parameters to load.
C<updater>: a code ref to a function that will update the SPs based on the data
of a record. C<&updater> is called with a hashref of the SPs as the first
parameter, and key/value pairs of the record data as the remaining parameters.
C<&updater> should directly update the hashref, not replace it.
=head1 LICENSE AND COPYRIGHT
Copyright (c) 2018 Christopher White. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the the Artistic License (2.0). Details are in the LICENSE
file accompanying this distribution.
=cut
# }}}2
# vi: set ts=4 sts=4 sw=4 et ai fo-=ro foldmethod=marker foldlevel=1: #