---
name: "Bread::Board::Service::WithDependencies"
section: "3pm"
platform: "linux"
package: "libbread-board-perl"
version: "0.37-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Bread::Board::Service::WithDependencies"
---

# Bread::Board::Service::WithDependencies(3pm)

Services with dependencies

## NAME

Bread::Board::Service::WithDependencies - Services with dependencies

## VERSION

version 0.37

## DESCRIPTION

This is a sub-role of Bread::Board::Service, for services with dependencies. It provides the mechanism to recursively resolve dependencies.

## ATTRIBUTES

### "dependencies"

Hashref, constrained by `"Bread::Board::Service::Dependencies"`. Values must be instances of Bread::Board::Dependency, but can be coerced from various other types, see the type's docs.

## METHODS

### "add\_dependency"

```
  $service->add_dependency(name=>$dep);
```

Adds a new dependency.

### "get\_dependency"

```
  my $dep = $service->get_dependency('name');
```

Gets a dependency by name.

### "has\_dependency"

```
  if ($service->has_dependency('name')) { ... }
```

Returns true if this service has a dependency with the given name.

### "has\_dependencies"

```
  if ($service->has_dependencies) { ... }
```

Returns true if this service has any dependency.

### "get\_all\_dependencies"

```
  my %deps = $service->get_all_dependencies;
```

Returns all the dependencies for this service, as a key-value list.

### "init\_params"

Builder for the service parameters, augmented to inject all the resolved dependencies into the `"params"` attribute, so that `"get"` can use them.

### "get"

*After* the `"get"` method, the `"params"` attribute is cleared, to make sure that dependencies will be resolved again on the next call (of course, if the service is using a singleton lifecycle, the whole "getting" only happens once).

### "resolve\_dependencies"

```
  my %name_object_map = $self->resolve_dependencies;
```

For each element of "dependencies", calls its `"service"` method to retrieve the service we're dependent on, then tries to instantiate the value of the service. This can happen in a few different ways:

- the service is not locked, and does not require any parameter

  just call `"get"` on it

- the service is not locked, requires parameters, but the dependency has values for them

  call `"$service->get(%{$dependency->service_params})"`

- the service is not locked, requires parameters, and we don't have values for them

  we can't instantiate anything at this point, so we use a Bread::Board::Service::Deferred::Thunk instance, on which you can call the `"inflate"` method, passing it all the needed parameters, to get the actual instance

- the service is locked

  we return a Bread::Board::Service::Deferred that will proxy to the instance that the service will eventually return; yes, this means that in many cases circular dependencies can be resolved, at the cost of a proxy object

## AUTHOR

Stevan Little \<stevan@iinteractive.com\>

## BUGS

Please report any bugs or feature requests on the bugtracker website https://github.com/stevan/BreadBoard/issues

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

## COPYRIGHT AND LICENSE

This software is copyright (c) 2019, 2017, 2016, 2015, 2014, 2013, 2011, 2009 by Infinity Interactive.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
