File Coverage

blib/lib/Mojo/Base/Che.pm
Criterion Covered Total %
statement 36 50 72.0
branch 24 42 57.1
condition 4 15 26.6
subroutine 179 273 65.5
pod 1 1 100.0
total 244 381 64.0


line stmt bran cond sub pod time code
1             package Mojo::Base::Che;
2             # ABSTRACT: some patch for Mojo::Base(current 8.23)
3              
4 1     1   620 use Mojo::Base -strict;
  1         209011  
  1         7  
5             #~ use mro;# weak
6              
7             # copy-paste sub Mojo::Base::attr + patch 1 line #~
8             sub Mojo::Base::attr {
9 197     197 1 355823 my ($self, $attrs, $value, %kv) = @_;
10 197 50 33     1109 return unless (my $class = ref $self || $self) && $attrs;
      33        
11            
12 197 50 66     617 Carp::croak 'Default has to be a code reference or constant value'
13             if ref $value && ref $value ne 'CODE';
14 197 50       511 Carp::croak 'Unsupported attribute option' if grep { $_ ne 'weak' } keys %kv;
  9         48  
15            
16             # Weaken
17 197 100       440 if ($kv{weak}) {
18 9         29 state %weak_names;
19 9 50       32 unless ($weak_names{$class}) {
20 9         27 my $names = $weak_names{$class} = [];
21             my $sub = sub {
22 0     0   0 my $self = shift->next::method(@_);
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
23 0   0     0 ref $self->{$_} and Scalar::Util::weaken $self->{$_} for @$names;
24 0         0 return $self;
25 9         47 };
26 9         49 Mojo::Util::monkey_patch(my $base = $class . '::_Base', 'new', $sub);
27 1     1   412 no strict 'refs';
  1         2  
  1         735  
28 9         203 unshift @{"${class}::ISA"}, $base;
  9         153  
29             }
30 9 100       27 push @{$weak_names{$class}}, ref $attrs eq 'ARRAY' ? @$attrs : $attrs;
  9         47  
31             }
32            
33 197 100       258 for my $attr (@{ref $attrs eq 'ARRAY' ? $attrs : [$attrs]}) {
  197         690  
34             #~ Carp::croak qq{Attribute "$attr" invalid} unless $attr =~ /^[a-zA-Z_]\w*$/;
35            
36             # Very performance-sensitive code with lots of micro-optimizations
37 255         1200 my $sub;
38 255 100       658 if ($kv{weak}) {
    100          
    100          
39 10 100       22 if (ref $value) {
40             $sub = sub {
41             return exists $_[0]{$attr}
42             ? $_[0]{$attr}
43             : (
44             ref($_[0]{$attr} = $value->($_[0]))
45             && Scalar::Util::weaken($_[0]{$attr}),
46 0 0 0 0   0 $_[0]{$attr}
    0   0      
        0      
        0      
        0      
        0      
        0      
        0      
47             ) if @_ == 1;
48 0 0       0 ref($_[0]{$attr} = $_[1]) and Scalar::Util::weaken($_[0]{$attr});
49 0         0 $_[0];
50 7         30 };
51             }
52             else {
53             $sub = sub {
54 0 0   0   0 return $_[0]{$attr} if @_ == 1;
        0      
        0      
        0      
55 0 0       0 ref($_[0]{$attr} = $_[1]) and Scalar::Util::weaken($_[0]{$attr});
56 0         0 $_[0];
57 3         14 };
58             }
59             }
60             elsif (ref $value) {
61             $sub = sub {
62             return
63 23 100   23   2505 exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
    100   23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
        23      
64             if @_ == 1;
65 1         4 $_[0]{$attr} = $_[1];
66 1         4 $_[0];
67 119         409 };
68             }
69             elsif (defined $value) {
70             $sub = sub {
71 1 50   1   21 return exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value)
    50   1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
        1      
72             if @_ == 1;
73 0         0 $_[0]{$attr} = $_[1];
74 0         0 $_[0];
75 55         252 };
76             }
77             else {
78             $sub
79 71 0   0   252 = sub { return $_[0]{$attr} if @_ == 1; $_[0]{$attr} = $_[1]; $_[0] };
  0     0   0  
  0     0   0  
  0     0   0  
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
80             }
81 255         641 Mojo::Util::monkey_patch($class, $attr, $sub);
82             }
83             }
84              
85              
86              
87             #~ sub import {
88             #~ my ($class, $caller) = (shift, caller);
89             #~ my @flags = _lib_flags(@_);
90             #~ Mojo::Base->import(@flags); # patch 2
91             #~ }
92              
93              
94             #~ sub _lib_flags {# patch2
95             #~ my ($flag, $findbin, @flags, @libs) = ();
96              
97             #~ while ((my $it = shift) || @_) {# parse flags
98             #~ unshift @_, @$it
99             #~ and next
100             #~ if ref $it eq 'ARRAY';
101            
102             #~ next
103             #~ unless defined($it) && $it =~ m'/|\w';# / root lib? lets
104              
105             #~ if ($it =~ s'^(-\w+)'') {# controll flag
106             #~ $flag = $1;
107             #~ push @flags, $flag
108             #~ and next
109             #~ unless $flag eq '-lib';
110              
111             #~ unshift @_, split m'[:;]+', $it # -lib:foo;bar
112             #~ if $it;
113              
114             #~ next;
115             #~ } elsif (!$flag || $flag ne '-lib') { # non controll
116             #~ push @flags, $it;
117             #~ next;
118             #~ # unless $flag && $flag eq '-lib';# non lib items
119             #~ }
120            
121             #~ push @libs, $it # abs lib
122             #~ and next
123             #~ if $it =~ m'^/';
124            
125             #~ $findbin ||= require FindBin && $FindBin::Bin;# relative lib
126             #~ push @libs, $findbin.'/'.$it;
127             #~ }
128            
129             #~ my @ok_libs = grep { my $lib = $_; not scalar grep($lib eq $_, @INC) } @libs
130             #~ if @libs;
131             #~ require lib
132             #~ and lib->import(@ok_libs)
133             #~ if @ok_libs;
134            
135             #~ return @flags;
136             #~ }
137              
138             1;
139              
140             =pod
141              
142             =encoding utf8
143              
144             Доброго всем
145              
146             =head1 Mojo::Base::Che
147              
148             ¡ ¡ ¡ ALL GLORY TO GLORIA ! ! !
149              
150             =head1 NAME
151              
152             Mojo::Base::Che - some patch for Mojo::Base
153              
154             =head1 DESCRIPTION
155              
156             Патчи L.
157              
158             =head2 Причины патчей
159              
160             1. НЕТ!!NO!!!1111 Добавление путей в @INC;
161              
162             2. Разрешены хазы/атрибуты не только латиницей;
163              
164             =head1 SYNOPSIS
165              
166             НЕТ!!NO!!!1111 This module provide a extended form for add extra lib directories to perl's search path. See L
167              
168             НЕТ!!NO!!!1111 use Mojo::Base::Che -lib, qw(rel/path/lib /abs/path/lib);
169             НЕТ!!NO!!!1111 use Mojo::Base::Che -lib, ['lib1', 'lib2'];
170             НЕТ!!NO!!!1111 use Mojo::Base::Che '-lib:lib1:lib2;lib3';
171             НЕТ!!NO!!!1111 use Mojo::Base::Che -strict, qw(-lib lib1 lib2);
172             НЕТ!!NO!!!1111 use Mojo::Base::Che qw(-base -lib lib1 lib2);
173             НЕТ!!NO!!!1111 use Mojo::Base::Che 'SomeBaseClass', qw(-lib lib1 lib2);
174            
175             use lib 'lib';
176             use Mojo::Base 'Foo';
177             use Mojo::Base::Che; # apply patch
178             # GLORY utf names allow
179             has [qw(☭хаза ☆маза)];
180              
181             НЕТ!!NO!!!1111 For relative lib path will use L module and C<$FindBin::Bin> is prepends to that lib.
182             НЕТ!!NO!!!1111 Libs always applied first even its last on flags list.
183              
184             =head1 SEE ALSO
185              
186             L
187              
188             =head1 AUTHOR
189              
190             Михаил Че (Mikhail Che), C<< >>
191              
192             =head1 BUGS / CONTRIBUTING
193              
194             Please report any bugs or feature requests at L.
195              
196             =head1 COPYRIGHT
197              
198             Copyright 2016-2018+ Mikhail Che.
199              
200             This library is free software; you can redistribute it and/or modify
201             it under the same terms as Perl itself.
202              
203             =cut