Rewire
view release on metacpan or search on metacpan
lib/Rewire/Engine.pm view on Meta::CPAN
package Rewire::Engine;
use 5.014;
use strict;
use warnings;
use registry;
use routines;
use Data::Object::Space;
use Scalar::Util ();
# FUNCTIONS
# returns the json-schema-based engine ruleset
fun ruleset() {
state $ruleset = require Rewire::Ruleset;
}
# returns context closure
fun context() {
my $cache = {};
fun(Str $name, Any $object) {
return $cache->{$name} = $object if $object;
return $cache->{$name};
}
}
# returns the compilation of 2+ service configurations
fun merger(HashRef $servSpec, HashRef $servA, HashRef $servB = {}) {
my $service = {};
my $service_a = $servA;
my $service_b = $servB;
if (my $extends = $service_b->{extends}) {
$service_b = merger($servSpec, $service_b, $servSpec->{$extends});
}
$service = {%$service_b, %$service_a};
delete $service->{extends};
if ( (my $arg_a = $service_a->{argument})
|| (my $arg_b = $service_b->{argument}))
{
if ( (defined $service_a->{argument} && !ref($arg_a))
|| (defined $service_b->{argument} && !ref($arg_b)))
{
$service->{argument} ||= $arg_a if $arg_a;
}
elsif ((defined $service_a->{argument} && (ref($arg_a) eq 'ARRAY'))
&& (defined $service_b->{argument} && (ref($arg_b) eq 'ARRAY')))
{
$service->{argument} = [@$arg_b, @$arg_a];
}
elsif ((defined $service_a->{argument} && (ref($arg_a) eq 'HASH'))
&& (defined $service_b->{argument} && (ref($arg_b) eq 'HASH')))
{
$service->{argument} = {%$arg_b, %$arg_a};
}
else {
$service->{argument} ||= $arg_a if $arg_a;
}
}
return $service;
}
# returns context with eager-loaded objects
fun preload(HashRef $servConf, Maybe[CodeRef] $context) {
$context = context() if !$context;
if (my $servSpec = $servConf->{services}) {
for my $name (keys %$servSpec) {
next if $context->($name);
( run in 4.534 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )