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 )