.\" 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::Manual::Example::LogDispatch 3pm" .TH Bread::Board::Manual::Example::LogDispatch 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::Manual::Example::LogDispatch \- An example of composing a dynamic Log::Dispatch object. .SH "VERSION" .IX Header "VERSION" version 0.37 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 10 \& my $c = container \*(AqLogging\*(Aq => as { \& service \*(AqLogger\*(Aq => ( \& block => sub { \& my $s = shift; \& my $c = $s\->parent; \& my $outputs = $c\->get_sub_container(\*(AqOutputs\*(Aq); \& my $log = Log::Dispatch\->new; \& foreach my $name ( $outputs\->get_service_list ) { \& $log\->add( \& $outputs\->get_service( $name )\->get \& ); \& } \& $log; \& } \& ); \& \& container \*(AqOutputs\*(Aq => as { \& service \*(AqFile\*(Aq => ( \& block => sub { \& Log::Dispatch::File\->new( \& name => \*(Aqfile\*(Aq, \& min_level => \*(Aqdebug\*(Aq, \& filename => \*(Aqlogfile\*(Aq \& ) \& } \& ); \& service \*(AqScreen\*(Aq => ( \& block => sub { \& Log::Dispatch::Screen\->new( \& name => \*(Aqscreen\*(Aq, \& min_level => \*(Aqwarning\*(Aq, \& ) \& } \& ); \& }; \& }; \& \& my $logger = $c\->resolve( service => \*(AqLogging/Logger\*(Aq ); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This example was inspired by a discussion I had with Jay Shirley. He wanted to know an easy way to have a dynamic list of output types for his Log::Dispatch object. .PP Often with Bread::Board you will be wiring up components that are of a fixed type and set, but this is not always the case. It is in these cases when you can simply use the Bread::Board objects themselves to fetch your dependencies. .PP The value passed into the block of a BlockInjection service is the service itself. Calling the \f(CW\*(C`parent\*(C'\fR method on that service will give you the container that service is in. From there you can introspect the other containers and services any which way you want to. .PP This example can be made even more dynamic if you build the \&'Logging' component as a parameterized container whose parameter is the 'Outputs' container. Here is what that would look like. .PP .Vb 10 \& my $logging = container \*(AqLogging\*(Aq => [ \*(AqOutputs\*(Aq ] => as { \& service \*(AqLogger\*(Aq => ( \& block => sub { \& my $s = shift; \& my $c = $s\->parent; \& my $outputs = $c\->get_sub_container(\*(AqOutputs\*(Aq); \& my $log = Log::Dispatch\->new; \& foreach my $name ( $outputs\->get_service_list ) { \& $log\->add( \& $outputs\->get_service( $name )\->get \& ); \& } \& $log; \& } \& ); \& }; \& \& \& my $outputs = container \*(AqOutputs\*(Aq => as { \& service \*(AqFile\*(Aq => ( \& block => sub { \& Log::Dispatch::File\->new( \& name => \*(Aqfile\*(Aq, \& min_level => \*(Aqdebug\*(Aq, \& filename => \*(Aqlogfile\*(Aq \& ) \& } \& ); \& service \*(AqScreen\*(Aq => ( \& block => sub { \& Log::Dispatch::Screen\->new( \& name => \*(Aqscreen\*(Aq, \& min_level => \*(Aqwarning\*(Aq, \& ) \& } \& ); \& }; \& \& my $c = $logging\->create( Outputs => $outputs ); \& my $ld = $c\->resolve( service => \*(AqLogging/Logger\*(Aq ); .Ve .PP This example illustrates how when a parameterized container is instantiated, the parameters become sub-containers of the resulting container. This makes it just as easy to fetch the 'Outputs' container and use it inside the 'Logger' service. .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.