App-Context
view release on metacpan or search on metacpan
lib/App/Context.pm view on Meta::CPAN
$service->{$attrib} = $service_type_conf->{$attrib};
}
}
}
}
}
################################################################
# take care of all %$args attributes next
################################################################
# A "lightweight" service is one which never stores its attributes in
# the session store. It assumes that all necessary attributes will
# be supplied by the conf or by the code. As a result, a "lightweight"
# service can usually never handle events.
# 1. its attributes are only ever required when they are all supplied
# 2. its attributes will be OK by combining the %$args with the %$conf
# This all saves space in the Session store, as the attribute values can
# be relied upon to be supplied by the conf file and the code (and
# minimal reliance on the Session store).
# This is really handy when you have something like a huge spreadsheet
# of text entry cells (usually an indexed variable).
if ($temporary) { # may be specified implicitly
$lightweight = 1;
}
elsif (defined $args->{lightweight}) { # may be specified explicitly
$lightweight = $args->{lightweight};
}
else {
$lightweight = ($name =~ /[\{\}\[\]]/); # or implicitly for indexed variables
}
$override = $args->{override};
if ($new_service || $override) {
foreach $attrib (keys %$args) {
# don't include the entry which says whether we are overriding or not
next if ($attrib eq "override");
# include attrib if overriding OR attrib not provided in the session_object confs already
if (!defined $service->{$attrib} ||
($override && $service->{$attrib} ne $args->{$attrib})) {
$service->{$attrib} = $args->{$attrib};
$session->{store}{$type}{$name}{$attrib} = $args->{$attrib} if (!$lightweight);
}
$self->dbgprint("Context->service() [arg=$attrib] name=$name lw=$lightweight ovr=$override",
" service=", $service->{$attrib},
" service_store=", $service_store->{$attrib},
" args=", $args->{$attrib})
if ($App::DEBUG && $self->dbg(6));
}
}
if ($new_service) {
$self->dbgprint("Context->service() new service [$name]")
if ($App::DEBUG && $self->dbg(3));
if (!$temporary && defined $service->{default}) {
$default = $service->{default};
if ($default =~ /^\{today\}\+?(-?[0-9]+)?$/) {
$default = time2str("%Y-%m-%d",time + 2*3600 + ($1 ? ($1*3600*24) : 0));
}
if (defined $default) {
$self->so_get($name, "", $default, 1);
$self->so_delete($name, "default");
}
}
$class = $service->{class}; # find class of service
if (!defined $class || $class eq "") {
$class = "App::$type"; # assume the "generic" class
$service->{class} = $class;
}
if (! $self->{used}{$class}) { # load the code
App->use($class);
$self->{used}{$class} = 1;
}
$self->dbgprint("Context->service() service class [$class]")
if ($App::DEBUG && $self->dbg(3));
bless $service, $class; # bless the service into the class
if (!$temporary) {
$session->{cache}{$type}{$name} = $service; # save in the cache
}
$service->_init(); # perform additional initializations
}
$self->dbgprint("Context->service() = $service")
if ($App::DEBUG && $self->dbg(3));
&App::sub_exit($service) if ($App::trace);
return $service;
}
#############################################################################
# service convenience methods
#############################################################################
=head2 serializer()
=head2 call_dispatcher()
=head2 message_dispatcher()
=head2 resource_locker()
=head2 shared_datastore()
=head2 authentication()
=head2 authorization()
=head2 session_object()
These are all convenience methods, which simply turn around
and call the service() method with the service type as the
first argument.
* Signature: $session = $context->session();
( run in 1.489 second using v1.01-cache-2.11-cpan-39bf76dae61 )