NAME

Evo::Di - Dependency injection

VERSION

version 0.0405

DESCRIPTION

Injection is a value of inject option in Evo::Class. Use it this way

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

has 'ip';
$di->provide('My::C1@defaults' => {ip => '127.0.0.1'});

SYNOPSYS

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

TRIAL

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.

ATTRIBUTES

di_stash

A hash reference containing our dependencies (single instances)

METHODS

provide($self, $key, $v)

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'});

single($self, $key)

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)

mortal($self, $class)

Build an instance of class resolving required dependencies

AUTHOR

alexbyk.com

COPYRIGHT AND LICENSE

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.