File Coverage

lib/PEF/Front/Model.pm
Criterion Covered Total %
statement 30 53 56.6
branch 10 22 45.4
condition 4 17 23.5
subroutine 5 7 71.4
pod 0 3 0.0
total 49 102 48.0


line stmt bran cond sub pod time code
1             package PEF::Front::Model;
2              
3 1     1   28155 use PEF::Front::Config;
  1         2  
  1         13  
4              
5 1     1   8 use strict;
  1         2  
  1         18  
6 1     1   4 use warnings;
  1         2  
  1         653  
7              
8             sub normalize_method_name {
9 9     9 0 15 my $name = $_[0];
10 9 100 66     54 if ($name =~ /^\^?PEF::Front/ || $name =~ /^\^/) {
11 5         24 $name =~ s/^\^//;
12             } else {
13 4         15 $name = cfg_app_namespace . "Local::$name";
14             }
15 9         36 $name;
16             }
17              
18             sub make_model_call {
19 0     0 0 0 my ($method, $model) = @_;
20 0         0 my ($model_sub, $cfg_model_sub);
21 0 0 0     0 if ($model && !ref($model) && $model =~ /^\^?\w+::/) {
      0        
22 0         0 $model = normalize_method_name($model);
23 0         0 my $class = substr($model, 0, rindex($model, "::"));
24 0         0 my $can = substr($model, rindex($model, "::") + 2);
25 0         0 eval "use $class";
26 0 0 0     0 $@ = "$class must contain $can function" if not $@ and not $class->can($can);
27 0 0       0 croak {
28 0         0 result => 'INTERR',
29             answer => 'Validator $1 loading model error: $2',
30             answer_args => [$method, "$@"],
31             }
32             if $@;
33 0         0 $model_sub = eval "sub { eval { $model(\@_) } }";
34             } else {
35 0   0     0 $model ||= 'rpc_site';
36 0         0 $cfg_model_sub = eval {cfg_model_rpc($model)};
  0         0  
37 0 0       0 $@ = "cfg_model_rpc('$model') must return code reference" if ref $cfg_model_sub ne 'CODE';
38 0 0       0 croak {
39 0         0 result => 'INTERR',
40             answer => 'Validator $1 loading model error: $2',
41             answer_args => [$method, "$@"],
42             }
43             if $@;
44 0         0 $model_sub = eval "sub { eval { \$cfg_model_sub->(\@_) } }";
45             }
46 0         0 return ($model, $model_sub);
47             }
48              
49             sub _chain_links_sub {
50 5     5   2025 my $links = $_[0];
51 5 100 66     35 $links = [$links] if not ref $links or ref $links ne 'ARRAY';
52 5         8 my @handlers;
53 5         13 for my $link (@$links) {
54 9 100       27 if (not ref $link) {
    50          
55 6         16 push @handlers, normalize_method_name($link);
56             } elsif (ref $link eq 'HASH') {
57 3         13 push @handlers, map {[normalize_method_name($_), $link->{$_}]} keys %$link;
  3         10  
58             }
59             }
60 5         12 my $sub_str = <
61             sub {
62             my (\$req, \$context) = \@_;
63             my \$response;
64             EOS
65 5         16 for (my $i = 0; $i < @handlers; ++$i) {
66 9 100       25 if (ref $handlers[$i]) {
67 3         17 $sub_str .= "\t\$response = $handlers[$i][0](\$req, \$context, \$response, \$handlers[$i][1]);\n";
68             } else {
69 6         24 $sub_str .= "\t\$response = $handlers[$i](\$req, \$context, \$response);\n";
70             }
71             }
72 5         14 $sub_str .= "\t\$response;\n}\n";
73 5 50       14 if (wantarray) {
74 0         0 my $sub = eval $sub_str;
75 0         0 return ($sub, $sub_str);
76             } else {
77 5         25 return $sub_str;
78             }
79             }
80              
81             sub chain_links {
82 0     0 0   my ($sub, $sub_str) = _chain_links_sub($_[0]);
83 0           return $sub;
84             }
85              
86             1;
87              
88             __END__