Evo::Di - Dependency injection
version 0.0405
Injection is a value of inject option in Evo::Class. Use it this way
inject
If you need to describe a dependency of some class, write this class
has dep => inject 'My::Class';
This class will be build, resolved and injected
If you need to provide a global value, for example, processor cores, you can use UPPER_CASE constants. You need to provide a value for this dependency
has cores => inject 'CORES'; $di->provide(CORES => 8);
For convineince, there is a special @defaults provider modificator. That helps to build values without inject attributes
@defaults
has 'ip'; $di->provide('My::C1@defaults' => {ip => '127.0.0.1'});
use Evo -Di; { package My::C1; use Evo -Class, -Loaded; has c2 => inject 'My::C2'; has 'required'; # can be provided by My::C1@defaults package My::C2; use Evo -Class, -Loaded; has c3 => inject 'My::C3'; package My::C3; use Evo -Class, -Loaded; has foo => inject 'FOO'; package My::Mortal; use Evo -Class, -Loaded; has c1 => inject 'My::C1'; has 'counter'; } my $di = Evo::Di->new(); # provide some value in stash wich will be available as dependency 'FOO' $di->provide(FOO => 'FOO value'); # provide config using dot notation $di->provide('My::C1@defaults' => {required => 'OK'}); my $c1 = $di->single('My::C1'); say $c1 == $di->single('My::C1'); say $c1 == $di->single('My::C1'); say $c1->c2->c3 == $di->single('My::C3'); say $c1->c2->c3->foo; # FOO value say $c1->required; # OK my $temp1 = $di->mortal('My::Mortal', counter => 1); my $temp2 = $di->mortal('My::Mortal', counter => 2); say $temp1->c1 eq $temp2->c1; # true say $temp1 eq $temp2; # false
This module is in early alpha stage. The implementation will be changed. The syntax probably will remain the same. Right now it can only build singletones.
A hash reference containing our dependencies (single instances)
You can put in stash any value as a dependency
$di->provide('SOME_CONSTANT' => 33); say $di->single('SOME_CONSTANT'), 33; $di->provide('My::C1@defaults' => {ip => '127.0.0.1', port => '3000'});
If there is already a dependency with this key, return it. If not, build it, resolving a dependencies tree. Has a protection from circular dependencies (die if A->B->C->A)
Build an instance of class resolving required dependencies
alexbyk.com
This software is copyright (c) 2016 by alexbyk.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install Evo, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Evo
CPAN shell
perl -MCPAN -e shell install Evo
For more information on module installation, please visit the detailed CPAN module installation guide.