.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Bread::Board::Service::WithDependencies 3pm" .TH Bread::Board::Service::WithDependencies 3pm "2022-12-12" "perl v5.36.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Bread::Board::Service::WithDependencies \- Services with dependencies .SH "VERSION" .IX Header "VERSION" version 0.37 .SH "DESCRIPTION" .IX Header "DESCRIPTION" This is a sub-role of Bread::Board::Service, for services with dependencies. It provides the mechanism to recursively resolve dependencies. .SH "ATTRIBUTES" .IX Header "ATTRIBUTES" .ie n .SS """dependencies""" .el .SS "\f(CWdependencies\fP" .IX Subsection "dependencies" Hashref, constrained by \f(CW\*(C`Bread::Board::Service::Dependencies\*(C'\fR. Values must be instances of Bread::Board::Dependency, but can be coerced from various other types, see the type's docs. .SH "METHODS" .IX Header "METHODS" .ie n .SS """add_dependency""" .el .SS "\f(CWadd_dependency\fP" .IX Subsection "add_dependency" .Vb 1 \& $service\->add_dependency(name=>$dep); .Ve .PP Adds a new dependency. .ie n .SS """get_dependency""" .el .SS "\f(CWget_dependency\fP" .IX Subsection "get_dependency" .Vb 1 \& my $dep = $service\->get_dependency(\*(Aqname\*(Aq); .Ve .PP Gets a dependency by name. .ie n .SS """has_dependency""" .el .SS "\f(CWhas_dependency\fP" .IX Subsection "has_dependency" .Vb 1 \& if ($service\->has_dependency(\*(Aqname\*(Aq)) { ... } .Ve .PP Returns true if this service has a dependency with the given name. .ie n .SS """has_dependencies""" .el .SS "\f(CWhas_dependencies\fP" .IX Subsection "has_dependencies" .Vb 1 \& if ($service\->has_dependencies) { ... } .Ve .PP Returns true if this service has any dependency. .ie n .SS """get_all_dependencies""" .el .SS "\f(CWget_all_dependencies\fP" .IX Subsection "get_all_dependencies" .Vb 1 \& my %deps = $service\->get_all_dependencies; .Ve .PP Returns all the dependencies for this service, as a key-value list. .ie n .SS """init_params""" .el .SS "\f(CWinit_params\fP" .IX Subsection "init_params" Builder for the service parameters, augmented to inject all the resolved dependencies into the \f(CW\*(C`params\*(C'\fR attribute, so that \f(CW\*(C`get\*(C'\fR can use them. .ie n .SS """get""" .el .SS "\f(CWget\fP" .IX Subsection "get" \&\fIAfter\fR the \f(CW\*(C`get\*(C'\fR method, the \f(CW\*(C`params\*(C'\fR 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 \*(L"getting\*(R" only happens once). .ie n .SS """resolve_dependencies""" .el .SS "\f(CWresolve_dependencies\fP" .IX Subsection "resolve_dependencies" .Vb 1 \& my %name_object_map = $self\->resolve_dependencies; .Ve .PP For each element of \*(L"dependencies\*(R", calls its \f(CW\*(C`service\*(C'\fR 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: .IP "the service is not locked, and does not require any parameter" 4 .IX Item "the service is not locked, and does not require any parameter" just call \f(CW\*(C`get\*(C'\fR on it .IP "the service is not locked, requires parameters, but the dependency has values for them" 4 .IX Item "the service is not locked, requires parameters, but the dependency has values for them" call \f(CW\*(C`$service\->get(%{$dependency\->service_params})\*(C'\fR .IP "the service is not locked, requires parameters, and we don't have values for them" 4 .IX Item "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 \f(CW\*(C`inflate\*(C'\fR method, passing it all the needed parameters, to get the actual instance .IP "the service is locked" 4 .IX Item "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 .SH "AUTHOR" .IX Header "AUTHOR" Stevan Little .SH "BUGS" .IX Header "BUGS" Please report any bugs or feature requests on the bugtracker website https://github.com/stevan/BreadBoard/issues .PP 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. .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2019, 2017, 2016, 2015, 2014, 2013, 2011, 2009 by Infinity Interactive. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.