# NAME

Catalyst::Plugin::MapComponentDependencies - Allow components to depend on other components

# SYNOPSIS

      package MyApp;
      
      use Moose;
      use Catalyst;
    
      with 'Catalyst::Plugin::MapComponentDependencies';

      MyApp->map_dependencies(
        'Model::Foo' => {
          bar => 'Model::Bar',
          baz => sub {
            my ($app_or_ctx, $component_name) = @_;
            return ...;
          },
        },
      );

      MyApp->config(
        'Model::Foo' => { another_param => 'value' }
      )

      MyApp->setup;

During setup when 'Model::Foo' is created it will get all three key / value pairs
send to ->new.

**NOTE:** You need to compose this plugin via the [Moose](https://metacpan.org/pod/Moose) 'with' subroutine if you
want to get the handy class methods 'map\_dependencies' and 'map\_dependency'.  If you
prefer you may setup you dependencies via configuration:

      package MyApp;
      
      use Catalyst 'MapComponentDependencies';
    
      MyApp->config(
        'Model::Foo' => { another_param => 'value' },
        'Plugin::MapComponentDependencies' => {
          map_dependencies => {
            'Model::Foo' => {
              bar => 'Model::Bar',
              baz => sub {
                my ($app_or_ctx, $component_name) = @_;
                return ...;
              },
            },
          },
        },
      )

      MyApp->setup;

You may prefer this if your dependencies will map differently based on environment
and configuration settings.

# DESCRIPTION

Sometimes you would like a [Catalyst](https://metacpan.org/pod/Catalyst) component to depend on the value of an
existing component.  Since components are resolved during application setup (or
at request time, in the cause of a component that does ACCEPT\_CONTEXT) you cannot
specify this dependency mapping in the 'normal' [Catalyst](https://metacpan.org/pod/Catalyst) configuration hash.

This plugin, which requires a recent [Catalyst](https://metacpan.org/pod/Catalyst) of version 5.90090+, allows you to
define components which depend on each other.  You can also set the value of an
initial argument to the value of a coderef, for added dynamic flexibility.

# METHODS

This plugin defines the following methods

## map\_dependencies

Example:

    MyApp->map_dependencies(
      'Model::AnotherModel' => { aaa => 'Model::Foo' },
      'Model::Foo' => {
        bar => 'Model::Bar',
        baz => sub {
          my ($app_or_ctx, $component_name) = @_;
          return ...;
        },
      },
    );

Maps a list of components and dependencies

# map\_dependency

Maps a single component to a hashref of dependencies.

# CONFIGURATION

This plugin defines the configuration namespace 'Plugin::MapComponentDependencies'
and defines the following keys:

## map\_dependencies

A Hashref where the key is a target component and the value is a hashref of arguments
that will be sent to it during initializion.

# SEE ALSO

[Catalyst](https://metacpan.org/pod/Catalyst), [Catalyst::Plugin::InjectionHelpers](https://metacpan.org/pod/Catalyst::Plugin::InjectionHelpers).

# AUTHOR

John Napiorkowski [email:jjnapiork@cpan.org](email:jjnapiork@cpan.org)

# COPYRIGHT & LICENSE

Copyright 2015, John Napiorkowski [email:jjnapiork@cpan.org](email:jjnapiork@cpan.org)

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