Aion

 view release on metacpan or  search on metacpan

t/aion/pleroma.t  view on Meta::CPAN

use common::sense; use open qw/:std :utf8/;  use Carp qw//; use Cwd qw//; use File::Basename qw//; use File::Find qw//; use File::Slurper qw//; use File::Spec qw//; use File::Path qw//; use Scalar::Util qw//;  use Test::More 0.98;  use String::Diff q...
# # NAME
# 
# Aion::Pleroma - контейнер эонов
# 
# # SYNOPSIS
# 
subtest 'SYNOPSIS' => sub { 
use Aion::Pleroma;

my $pleroma = Aion::Pleroma->new;

local ($::_g0 = do {$pleroma->get('user')}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$pleroma->get(\'user\') # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
eval {$pleroma->resolve('user')}; local ($::_g0 = $@, $::_e0 = 'user is\'nt eon!'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, '$pleroma->resolve(\'user\') # @-> user is\'nt eon!' or ::diag ::_string_diff($::_g0, $::_e0, 1); undef $::_g...

# 
# # DESCRIPTION
# 
# Реализует паттерн контейнера зависимостей.
# 
# Эон создаётся при запросе из контейнера через метод `get` или `resolve`, либо через аспект `eon` как ленивый `default`. Ленивость можно отменить череÐ...
# 
# Контейнер можно получить с помощью `Aion->pleroma`.
# 
# Конфигурацию для создания эонов получает из конфига `PLEROMA` и файла аннотаций (создаётся пакетом `Aion::Annotation`). Файл аннотаций можно замениÑ...
# 
# # CONFIG
# 
# Настройки модуля, которые можно установить в `.env`:
# 
# * AION_PLEROMA_INI – файл аннотаций. По умолчанию `etc/annotation/eon.ann`.
# * AION_PLEROMA_AUTOWARE – подгружать модули автоматически, даже если они не прописаны в конфигурации. По умолчанию `1`.
# 
# # EONS FROM CONFIG
# 
# В `etc/*.yml` можно добавить ключ `aion.eon` с описанием дополнительных эонов. Это позволяет собирать эоны декларативно: задавать аргументы конс...
# 
# Опишем классы эонов.
# 
# Файл lib/Ex/Eon/Astronomer.pm:
#@> lib/Ex/Eon/Astronomer.pm
#>> package Ex::Eon::Astronomer;
#>> use strict; use warnings;
#>> 
#>> sub new { my ($class, $name, $telescope) = @_; bless { name => $name, telescope => $telescope, seen => [] }, $class }
#>> sub name      { $_[0]{name} }
#>> sub telescope { $_[0]{telescope} }
#>> sub seen      { $_[0]{seen} }
#>> sub observe   { my ($self, $body) = @_; push @{ $self->{seen} }, $body; $body }
#>> 
#>> 1;
#@< EOF
# 
# Файл lib/Ex/Eon/Planet.pm:
#@> lib/Ex/Eon/Planet.pm
#>> package Ex::Eon::Planet;
#>> use common::sense;
#>> use Aion;
#>> 
#>> has name       => (is => 'ro');
#>> has moons      => (is => 'ro', default => 0);
#>> has discoverer => (is => 'ro');
#>> 
#>> 1;
#@< EOF
# 
# Теперь конфигурация эонов. У эона-учёного `Ex::Eon::Galileo` аргументы заданы упорядоченно (`arguments` — массив), после создания вызывается метод `ob...
# 
# Файл etc/aion/eon.yml:
#@> etc/aion/eon.yml
#>> aion:
#>>   eon:
#>>     Ex::Eon::Galileo:
#>>       class: 'Ex::Eon::Astronomer'
#>>       arguments: [ 'Galileo Galilei', 'refracting telescope' ]
#>>       calls:
#>>         - [observe, '@Ex::Eon::Saturn']
#>>     Ex::Eon::Jupiter:
#>>       class: 'Ex::Eon::Planet'
#>>       arguments:
#>>         name: 'Jupiter'
#>>         moons: 95
#>>         discoverer: '@Ex::Eon::Galileo'
#>>     Ex::Eon::Saturn:
#>>       class: 'Ex::Eon::Planet'
#>>       arguments:
#>>         name: 'Saturn'
#>>         moons: 146
#@< EOF
# 
# Загрузим конфигурацию из `etc/aion/eon.yml`, создадим контейнер и запросим эоны.
# 
::done_testing; }; subtest 'EONS FROM CONFIG' => sub { 
use Aion::Pleroma;
use Aion::Env::Etc ();

my $etc = Aion::Env::Etc::parse('etc/aion/eon.yml');
my $pleroma = Aion::Pleroma->new(pleroma => $etc->{aion}{eon});

my $galileo = $pleroma->resolve('Ex::Eon::Galileo');
local ($::_g0 = do {$galileo->name}, $::_e0 = "Galileo Galilei"); ::ok $::_g0 eq $::_e0, '$galileo->name  # => Galileo Galilei' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {$galileo->telescope}, $::_e0 = "refracting telescope"); ::ok $::_g0 eq $::_e0, '$galileo->telescope  # => refracting telescope' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {ref($galileo->seen->[0])}, $::_e0 = "Ex::Eon::Planet"); ::ok $::_g0 eq $::_e0, 'ref($galileo->seen->[0])  # => Ex::Eon::Planet' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {$galileo->seen->[0]->name}, $::_e0 = "Saturn"); ::ok $::_g0 eq $::_e0, '$galileo->seen->[0]->name # => Saturn' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;



( run in 1.197 second using v1.01-cache-2.11-cpan-364913b4093 )