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 )