NAME
Rewire
ABSTRACT
Dependency Injection Container for Perl 5
SYNOPSIS
use Rewire;
my $services = {
filetemp => {
package => 'File/Temp'
},
tempfile => {
package => 'Mojo/File',
argument => { '$service' => 'filetemp' }
}
};
my $rewire = Rewire->new(services => $services);
$rewire->resolve('tempfile');
DESCRIPTION
This package provides methods for using dependency injection, and building objects and values.
INTEGRATES
This package integrates behaviors from:
LIBRARIES
This package uses type constraints from:
SCENARIOS
This package supports the following scenarios:
arguments
use Rewire;
my $metadata = {
applog => '/var/log/rewire.log'
};
my $services = {
mojo_log => {
package => 'Mojo/Log',
argument => {
path => { '$metadata' => 'applog' },
level => 'warn'
},
argument_as => 'list'
}
};
my $rewire = Rewire->new(
services => $services,
metadata => $metadata
);
This package supports providing static and/or dynamic arguments during object construction from metadata
or other services
.
builder
use Rewire;
my $services = {
mojo_date => {
package => 'Mojo/Date',
builder => [
{
method => 'new',
return => 'self'
},
{
method => 'to_datetime',
return => 'result'
}
]
}
};
my $rewire = Rewire->new(
services => $services,
);
This package supports specifying multiple build steps as function
, method
, and routine
calls and chaining them together.
config
use Rewire;
my $metadata = {
home => '/home/ubuntu'
};
my $services = {
tempfile => {
package => 'Mojo/File',
argument => { '$metadata' => 'home' }
}
};
my $rewire = Rewire->new(
services => $services,
metadata => $metadata
);
This package supports configuring services and metadata in the service of building objects and values.
constructor
use Rewire;
my $services = {
mojo_date => {
package => 'Mojo/Date',
constructor => 'new'
}
};
my $rewire = Rewire->new(
services => $services
);
This package supports specifying constructors other than the traditional new
routine. A constructor is always called with the package name as the invocant.
function
use Rewire;
my $services = {
foo_sum => {
package => 'Mojo/Util',
function => 'md5_sum',
argument => 'foo',
}
};
my $rewire = Rewire->new(
services => $services,
);
This package supports specifying construction as a function call, which when called does not provide an invocant.
lifecycle
use Rewire;
my $metadata = {
home => '/home/ubuntu'
};
my $services = {
tempfile => {
package => 'Mojo/File',
argument => { '$metadata' => 'home' },
lifecycle => 'singleton'
}
};
my $rewire = Rewire->new(
services => $services,
metadata => $metadata
);
This package supports different lifecycle options which determine when services are built and whether they're persisted.
metadata
use Rewire;
my $metadata = {
homedir => '/home',
tempdir => '/tmp'
};
my $services = {
home => {
package => 'Mojo/Path',
argument => { '$metadata' => 'homedir' },
},
temp => {
package => 'Mojo/Path',
argument => { '$metadata' => 'tempdir' },
}
};
my $rewire = Rewire->new(
services => $services,
metadata => $metadata
);
This package supports specifying data and structures which can be used in the construction of multiple services.
method
use Rewire;
my $services = {
mojo_url => {
package => 'Mojo/URL',
argument => 'https://perl.org',
method => 'new'
}
};
my $rewire = Rewire->new(
services => $services,
);
This package supports specifying construction as a method call, which when called provides the package or object instance as the invocant.
routine
use Rewire;
my $services = {
mojo_url => {
package => 'Mojo/URL',
argument => 'https://perl.org',
routine => 'new'
}
};
my $rewire = Rewire->new(
services => $services,
);
This package supports specifying construction as a function call, which when called provides the package as the invocant.
service
my $metadata = {
home => '/home/ubuntu'
};
my $services = {
tempfile => {
package => 'Mojo/File',
argument => { '$metadata' => 'home' },
lifecycle => 'eager'
}
};
my $rewire = Rewire->new(
services => $services,
metadata => $metadata
);
This package supports defining services to be constructed on-demand or automatically on instantiation.
ATTRIBUTES
This package has the following attributes:
context
context(CodeRef)
This attribute is read-only, accepts (CodeRef)
values, and is optional.
engine
engine(InstanceOf["Data::Object::Space"])
This attribute is read-only, accepts (InstanceOf["Data::Object::Space"])
values, and is optional.
metadata
metadata(HashRef)
This attribute is read-only, accepts (HashRef)
values, and is optional.
services
services(HashRef)
This attribute is read-only, accepts (HashRef)
values, and is optional.
METHODS
This package implements the following methods:
config
config() : HashRef
The config method returns the configuration based on the services
and metadata
attributes.
resolve
resolve(Str $name) : Any
The resolve method resolves and returns an object or value based on the service named.
validate
validate() : Object
The validate method validates the configuration and throws an exception if invalid, otherwise returns itself.
AUTHOR
Al Newkirk, awncorp@cpan.org
LICENSE
Copyright (C) 2011-2019, Al Newkirk, et al.
This is free software; you can redistribute it and/or modify it under the terms of the The Apache License, Version 2.0, as elucidated in the "license file".