Catalyst-Plugin-InjectionHelpers

 view release on metacpan or  search on metacpan

lib/Catalyst/ComponentRole/InjectionHelpers.pm  view on Meta::CPAN

package Catalyst::ComponentRole::InjectionHelpers;

use Moose::Role;
use Moose::Util;

has _version => (is=>'ro', required=>1);
has application => (is=>'ro', required=>1);
has from => (is=>'ro', isa=>'ClassName|CodeRef', required=>1);
has method => (is=>'ro', required=>1, default=>'new');
has injected_component_name => (is=>'ro', isa=>'Str', required=>1);
has injection_parameters => (is=>'ro', isa=>'HashRef', required=>1);
has get_config => (is=>'ro', isa=>'CodeRef', required=>1, default=>sub {sub { +{} }});
has roles => (is=>'ro', isa=>'ArrayRef', required=>1, default=>sub { +[] });
has transform_args => (is=>'ro', isa=>'CodeRef', predicate=>'has_transform_args');
has composed_class => (
  is=>'ro',
  init_arg=>undef,
  required=>1,
  lazy=>1,
  default=>sub { Moose::Util::with_traits($_[0]->from, @{$_[0]->roles}) });

sub merge_args {
  my ($self, $app_or_c, @args) = @_;
  my %global_config_args = %{ $self->get_config->($app_or_c) };

  # Ok, so if @args are a hash, it just gets combined, no harm at
  # all as long as you expect a hash.  But is @args is an array,
  # we want it FIRST, because we will assume the @args are intended to
  # be positional.

  # Remember @args only comes from $c->model($model, @args).
  # So here you can override global args from the call to model, and for
  # now we just do the dumbest possible merge type.
  return (%global_config_args, @args);
}

sub transform_args_if_needed {
  my ($self, $composed_class, $app_or_c, @merged_args) = @_;
  if($self->has_transform_args) {
    if($self->_version == 2) {
      @merged_args = $self->transform_args->(@merged_args);
    } else {
      @merged_args = $self->transform_args->($self, $composed_class, $app_or_c, @merged_args);
    }
  }
  return @merged_args;
}

sub build_new_instance {
  my ($self, $app_or_c, @args) = @_;
  my @merged_args = $self->merge_args($app_or_c, @args);
  my $method = $self->method;
  my $composed_class = ref($self->from)||'' eq "CODE" ?
    $self->from : $self->composed_class;

  @merged_args = $self->transform_args_if_needed($composed_class, $app_or_c, @merged_args);

  if((ref($method)||'') eq 'CODE') {
    if($self->_version == 2) {
      my @init_args = ($app_or_c, @merged_args);
      unshift @init_args, $composed_class unless ref($composed_class);
      return $method->(@init_args);
    } else {
      return $self->$method($composed_class, $app_or_c, @merged_args);
    }
  } else {
    return $composed_class->$method(@merged_args);
  }
}

=head1 NAME

Catalyst::ComponentRole::InjectionHelpers; - Common role for adaptors



( run in 1.077 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )