File Coverage

blib/lib/Mouse/Meta/Method/Delegation.pm
Criterion Covered Total %
statement 26 26 100.0
branch 12 12 100.0
condition 6 9 66.6
subroutine 16 16 100.0
pod n/a
total 60 63 95.2


line stmt bran cond sub pod time code
1             package Mouse::Meta::Method::Delegation;
2 6     6   37 use Mouse::Util qw(:meta); # enables strict and warnings
  6         12  
  6         45  
3 6     6   32 use Scalar::Util;
  6         12  
  6         1807  
4              
5             sub _generate_delegation{
6 21     21   57 my (undef, $attr, $handle_name, $method_to_call) = @_;
7              
8 21         38 my @curried_args;
9 21 100       67 if(ref($method_to_call) eq 'ARRAY'){
10 2         4 ($method_to_call, @curried_args) = @{$method_to_call};
  2         6  
11             }
12              
13             # If it has a reader, we must use it to make method modifiers work
14 21   66     81 my $reader = $attr->get_read_method() || $attr->get_read_method_ref();
15              
16 21         54 my $can_be_optimized = $attr->{_mouse_cache_method_delegation_can_be_optimized};
17              
18 21 100       62 if(!defined $can_be_optimized){
19 13         38 my $tc = $attr->type_constraint;
20             $attr->{_mouse_cache_method_delegation_can_be_optimized} =
21 13   66     84 (defined($tc) && $tc->is_a_type_of('Object'))
22             && ($attr->is_required || $attr->has_default || $attr->has_builder)
23             && ($attr->is_lazy || !$attr->has_clearer);
24             }
25              
26 21 100       58 if($can_be_optimized){
27             # need not check the attribute value
28             return sub {
29 3     3   6328 return shift()->$reader()->$method_to_call(@curried_args, @_);
        1      
        1      
        1      
        1      
30 5         71 };
31             }
32             else {
33             # need to check the attribute value
34             return sub {
35 18     18   8768 my $instance = shift;
        16      
        18      
        18      
        16      
        4      
        4      
        1      
36 18         78 my $proxy = $instance->$reader();
37              
38 18 100 66     188 my $error = !defined($proxy) ? ' is not defined'
    100          
39             : ref($proxy) && !Scalar::Util::blessed($proxy) ? qq{ is not an object (got '$proxy')}
40             : undef;
41 18 100       61 if ($error) {
42 4         19 $instance->meta->throw_error(
43             "Cannot delegate $handle_name to $method_to_call because "
44             . "the value of "
45             . $attr->name
46             . $error
47             );
48             }
49 14         84 $proxy->$method_to_call(@curried_args, @_);
50 16         241 };
51             }
52             }
53              
54              
55             1;
56             __END__