NAME
   DBIx::Class::ParameterizedJoinHack - Parameterized Relationship Joins

SYNOPSIS
       #
       #   The Result class we want to allow to join with a dynamic
       #   condition.
       #
       package MySchema::Result::Person;
       use base qw(DBIx::Class::Core);

       __PACKAGE__->load_components(qw(ParameterizedJoinHack));
       __PACKAGE__->table('person');
       __PACKAGE__->add_columns(
           id => {
               data_type => 'integer',
               is_nullable => 0,
               is_auto_increment => 1,
           },
           name => {
               data_type => 'text',
               is_nullable => 0,
           }
       );

       ...

       __PACKAGE__->parameterized_has_many(
           priority_tasks => 'MySchema::Result::Task',
           [['min_priority'] => sub {
               my $args = shift;
               return +{
                   "$args->{foreign_alias}.owner_id" => {
                       -ident => "$args->{self_alias}.id",
                   },
                   "$args->{foreign_alias}.priority" => {
                       '>=' => $_{min_priority},
                   },
               };
           }],
       );

       1;

       #
       #   The ResultSet class belonging to your Result
       #
       package MySchema::ResultSet::Person;
       use base qw(DBIx::Class::ResultSet);

       __PACKAGE__->load_components(qw(ResultSet::ParameterizedJoinHack));

       1;

       #
       #   A Result class to join against.
       #
       package MySchema::Result::Task;
       use base qw(DBIx::Class::Core);

       __PACKAGE__->table('task');
       __PACKAGE__->add_columns(
           id => {
               data_type => 'integer',
               is_nullable => 0,
               is_auto_increment => 1,
           },
           owner_id => {
               data_type => 'integer',
               is_nullable => 0,
           },
           priority => {
               data_type => 'integer',
               is_nullable => 0,
           },
       );

       ...

       1;

       #
       #   Using the parameterized join.
       #
       my @urgent = MySchema
           ->connect(...)
           ->resultset('Person')
           ->with_parameterized_join(
               priority_tasks => {
                   min_priority => 300,
               },
           )
           ->all;

WARNING
   This module uses DBIx::Class internals and may break at any time.

DESCRIPTION
   This DBIx::Class component allows to declare dynamically parameterized
   has-many relationships.

   Add the component to your Result class as usual:

       __PACKAGE__->load_components(qw( ParameterizedJoinHack ));

   See "parameterized_has_many" for details on declaring relations.

   See DBIx::Class::ResultSet::ParameterizedJoinHack for ResultSet usage.

   Note: Currently only "parameterized_has_many" is implemented, since it
   is the most requested use-case. However, adding support for other
   relationship types is possible if a use-case is found.

METHODS
 parameterized_has_many
       __PACKAGE__->parameterized_has_many(
           $relation_name,
           $foreign_source,
           [\@join_arg_names, \&join_builder],
           $attrs,
       );

   The $relation_name, $foreign_source, and $attrs are passed through to
   "has_many" as usual. The third argument is an array reference containing
   an (array reference) list of argument names and a code reference used to
   build the join conditions.

   The code reference will be called with the same arguments as if it had
   been passed to "has_many" directly, but the global %_ hash will contain
   the named arguments for the join.

   See the "SYNOPSIS" for an example of a definition.

SPONSORS
   Development of this module was sponsored by

   *   Ctrl O <http://ctrlo.com>

AUTHOR
    Matt S. Trout <[email protected]>

CONTRIBUTORS
    Robert Sedlacek <[email protected]>

COPYRIGHT
   Copyright (c) 2015 the DBIx::Class::ParameterizedJoinHack "AUTHOR" and
   "CONTRIBUTORS" as listed above.

LICENSE
   This library is free software and may be distributed under the same
   terms as perl itself.