Skip to content

Commit

Permalink
Merge 330806e into 41027e2
Browse files Browse the repository at this point in the history
  • Loading branch information
djerius committed Feb 1, 2019
2 parents 41027e2 + 330806e commit dece9d6
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 2 deletions.
28 changes: 26 additions & 2 deletions lib/Beam/Wire.pm
Original file line number Diff line number Diff line change
Expand Up @@ -488,10 +488,12 @@ sub create_service {
);
}

$service_info{class} = $self->resolve_class( $service_info{class} );

use_module( $service_info{class} );

if ( my $with = $service_info{with} ) {
my @roles = ref $with ? @{ $with } : ( $with );
my @roles = map { $self->resolve_role( $_ ) } ref $with ? @{ $with } : ( $with );
my $class = Moo::Role->create_class_with_roles( $service_info{class}, @roles );
$service_info{class} = $class;
}
Expand Down Expand Up @@ -889,6 +891,28 @@ sub resolve_ref {
return @ref;
}

=method resolve_class
my $class_name = $self->resolve_class( $class_name );
Resolve C<$class_name>. By default this simply returns C<$class_name>, but it could
be used to apply a module namespace prefix or some other transformation.
=cut

sub resolve_class { $_[1] }

=method resolve_role
my $class_name = $self->resolve_role( $role_name );
Resolve C<$role_name>. By default this simply returns C<$role_name>, but it could
be used to apply a module namespace prefix or some other transformation.
=cut

sub resolve_role { $_[1] }

=method fix_refs
my @fixed = $wire->fix_refs( $for_name, @args );
Expand Down Expand Up @@ -1048,7 +1072,7 @@ sub validate {
}

if ($config{class}) {
eval "require " . $config{class} if $config{class};
eval "require " . $self->resolve_class( $config{class} );
}
#TODO: check method chain & serial
}
Expand Down
35 changes: 35 additions & 0 deletions t/service/class.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@

use Test::More;
use Test::Exception;
use Test::Lib;
use Beam::Wire;

{
package ResolveClass;
use Moo::Role;

around 'resolve_class' => sub {
my $orig = shift;
return 'My::' . $_[1];
}
}


subtest 'class with name resolver' => sub {
my $wire = Beam::Wire->new(
config => {
foo => {
class => 'ClassTest',
args => { foo => bar },
},
},
);

Moo::Role->apply_roles_to_object( $wire, 'ResolveClass' );

my $foo;
lives_ok { $foo = $wire->get( 'foo' ) };
is $foo->foo, 'bar';
};

done_testing;
52 changes: 52 additions & 0 deletions t/service/with.t
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use Test::Deep;
use Test::Exception;
use Test::Lib;
use Beam::Wire;
use Moo::Role ();

subtest 'compose a single role' => sub {
my $wire = Beam::Wire->new(
Expand Down Expand Up @@ -49,4 +50,55 @@ subtest 'compose multiple roles' => sub {
cmp_deeply [ $svc->got_args_list ], [ foo => 'bar' ];
ok $svc->can( 'clone' );
};


{
package ResolveRole;
use Moo::Role;

around 'resolve_role' => sub {
my $orig = shift;
return 'My::' . $_[1];
}
}

subtest 'compose a single role with name resolver' => sub {
my $wire = Beam::Wire->new(
config => {
foo => {
class => 'My::ArgsTest',
with => 'ArgsListRole',
},
},
);

Moo::Role->apply_roles_to_object( $wire, 'ResolveRole' );

my $svc;
lives_ok { $svc = $wire->get( 'foo' ) };
isa_ok $svc, 'My::ArgsTest';
ok $svc->DOES( 'My::ArgsListRole' );
};

subtest 'compose multiple roles with name resolver' => sub {
my $wire = Beam::Wire->new(
config => {
foo => {
class => 'My::ArgsTest',
with => [
'ArgsListRole',
'CloneRole',
],
},
},
);

Moo::Role->apply_roles_to_object( $wire, 'ResolveRole' );

my $svc;
lives_ok { $svc = $wire->get( 'foo' ) };
isa_ok $svc, 'My::ArgsTest';
ok $svc->DOES( 'My::ArgsListRole' );
ok $svc->DOES( 'My::CloneRole' );
};
done_testing;

0 comments on commit dece9d6

Please sign in to comment.