line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
1
|
|
|
1
|
|
264099
|
use 5.014; # because we use the 'non-destructive substitution' feature (s///r) |
|
1
|
|
|
|
|
15
|
|
2
|
1
|
|
|
1
|
|
19
|
use strict; |
|
1
|
|
|
|
|
15
|
|
|
1
|
|
|
|
|
61
|
|
3
|
1
|
|
|
1
|
|
9
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
157
|
|
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
package Banal::Moosy::Mungers::DeviseFallbacks; |
6
|
|
|
|
|
|
|
# vim: set ts=2 sts=2 sw=2 tw=115 et : |
7
|
|
|
|
|
|
|
# ABSTRACT: Provide several MUNGER functions that may be use in conjunction with C. |
8
|
|
|
|
|
|
|
# KEYWORDS: Munge Has has MungeHas MooseX::MungeHas Moose MooseX Moo MooX |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = '0.001'; |
11
|
|
|
|
|
|
|
# AUTHORITY |
12
|
|
|
|
|
|
|
|
13
|
1
|
|
|
1
|
|
743
|
use Data::Printer; # DEBUG purposes. |
|
1
|
|
|
|
|
42523
|
|
|
1
|
|
|
|
|
8
|
|
14
|
1
|
|
|
1
|
|
135
|
use Scalar::Util qw(reftype); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
53
|
|
15
|
1
|
|
|
1
|
|
5
|
use List::Util 1.45 qw(pairs); |
|
1
|
|
|
|
|
18
|
|
|
1
|
|
|
|
|
176
|
|
16
|
|
|
|
|
|
|
|
17
|
1
|
|
|
1
|
|
483
|
use Banal::Util::Mini qw(peek tidy_arrayify); |
|
1
|
|
|
|
|
38824
|
|
|
1
|
|
|
|
|
10
|
|
18
|
|
|
|
|
|
|
|
19
|
1
|
|
|
1
|
|
1051
|
use namespace::autoclean; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
9
|
|
20
|
1
|
|
|
1
|
|
63
|
use Exporter::Shiny qw( mhs_fallbacks ); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
6
|
|
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
####################################### |
24
|
|
|
|
|
|
|
sub mhs_fallbacks { # Munge attr specs so that the attribute may use a 'fallback' routine for its 'default' sub. |
25
|
|
|
|
|
|
|
####################################### |
26
|
|
|
|
|
|
|
# ATTENTION : Special calling convention and interface defined by MooseX::MungeHas. |
27
|
0
|
|
|
0
|
0
|
|
my $name = $_; # $_ contains the attribute NAME |
28
|
0
|
|
|
|
|
|
%_ = (@_, %_); # %_ contains the attribute SPECS, whereas @_ contains defaults (prefs) for those specs. |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
# say STDERR 'Fallback munger : about to start munging : ...'; |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# Initial determination of some key properties involving fallback setup. |
33
|
0
|
|
|
|
|
|
my $fbo_detected = exists $_{fallback}; |
34
|
0
|
|
0
|
|
|
|
my %fbo = %{ delete( $_{fallback} ) // +{} }; |
|
0
|
|
|
|
|
|
|
35
|
0
|
|
0
|
|
|
|
my $disabled = delete( $_{no_fallback} ) // peek(\%fbo, [qw(disable disabled)], 0) // 0; |
|
|
|
0
|
|
|
|
|
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
# Grok some properties (either directly from the 'has' parameters (%_), or from the 'fallback' hash (%fbo) |
38
|
|
|
|
|
|
|
my %mappings = ( |
39
|
|
|
|
|
|
|
# Aliases |
40
|
|
|
|
|
|
|
alias => [qw(aka alias aliases) ], |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
#Actual fallback routines or values |
43
|
|
|
|
|
|
|
apriori => [qw(apriori primo) ], |
44
|
|
|
|
|
|
|
mid => [qw(mid nrm normally) ], |
45
|
|
|
|
|
|
|
final => [qw(def last fin final finally) ], |
46
|
|
|
|
|
|
|
via => [qw(via) ], |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
# Fallback source specifiers |
50
|
0
|
|
|
|
|
|
author_specific => [ map {; ($_, 'lookup_' . $_ ) } qw(author author_specific author_prefs author_specific_prefs author_defaults author_settings) ], |
|
0
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
# Special handling |
53
|
|
|
|
|
|
|
no_implicit => [qw(no_implicit) ], |
54
|
|
|
|
|
|
|
blanker_token => [qw(blanker blankers blanker_token blanker_tokens ) ], |
55
|
|
|
|
|
|
|
implicit_suffix => [qw(implicit_suffix implicit_suffixes implicit_suffices implicit_sfx ) ], |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
# wants |
58
|
|
|
|
|
|
|
multivalue => [qw(multivalue) ], |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
# Processing to be done on the result |
61
|
|
|
|
|
|
|
grep => [qw(grep greps filter filters) ], |
62
|
|
|
|
|
|
|
sort => [qw(sort) ], |
63
|
|
|
|
|
|
|
uniq => [qw(uniq unique) ], |
64
|
|
|
|
|
|
|
no_uniq => [qw(no_uniq no_unique) ], |
65
|
|
|
|
|
|
|
); |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
#say STDERR 'Fallback munger : about to start groking SETTINGS : ...'; |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
SETTING: |
70
|
0
|
|
|
|
|
|
while ( my ($k, $v) = (each %mappings) ) { |
71
|
0
|
|
|
|
|
|
my @eqv = tidy_arrayify($v); |
72
|
0
|
0
|
|
|
|
|
next SETTING if !@eqv; |
73
|
|
|
|
|
|
|
|
74
|
0
|
|
|
|
|
|
my @array = (); |
75
|
|
|
|
|
|
|
HASH: |
76
|
0
|
|
|
|
|
|
foreach my $h (\%fbo, \%_) { |
77
|
0
|
|
|
|
|
|
foreach my $e (@eqv) { #(grep {; $_ ne $k }(@eqv)) { |
78
|
0
|
0
|
|
|
|
|
push @array, tidy_arrayify( delete($h->{$e}) ) if exists $h->{$e}; |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
} |
81
|
|
|
|
|
|
|
|
82
|
0
|
|
|
|
|
|
@array = tidy_arrayify(@array); |
83
|
|
|
|
|
|
|
SWITCH: |
84
|
0
|
|
|
|
|
|
for (scalar(@array)) { |
85
|
0
|
0
|
|
|
|
|
$_ == 0 and do { delete $fbo{$k}; last SWITCH }; # no need to keep it around if it is empty. |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
86
|
0
|
0
|
|
|
|
|
$_ == 1 and do { $fbo{$k} = pop @array; last SWITCH }; # It's prettier |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
87
|
0
|
0
|
|
|
|
|
$_ > 1 and do { $fbo{$k} = [ @array ]; last SWITCH }; # multiple items. |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
} |
89
|
|
|
|
|
|
|
} |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
# Process aka/alias properties that are HASH references, which implies them being added to the 'handles' hash parameter. |
92
|
|
|
|
|
|
|
# This helps with the DRY principle, and is done regardless of fallback being enabled or not. |
93
|
|
|
|
|
|
|
|
94
|
0
|
|
|
|
|
|
my @handles; |
95
|
|
|
|
|
|
|
# 'delete' is used because we may end up with an empty list in the end. |
96
|
0
|
|
0
|
|
|
|
my @aliases = tidy_arrayify( (delete $fbo{alias}) // [] ); |
97
|
|
|
|
|
|
|
@aliases = map { |
98
|
0
|
|
|
|
|
|
my $alias = $_; |
|
0
|
|
|
|
|
|
|
99
|
0
|
0
|
0
|
|
|
|
if ( (reftype ($alias) // '') eq 'HASH') { |
100
|
0
|
0
|
|
|
|
|
push @handles, ( map {; $_->value ? (@$_) : () } pairs %$alias); # push only those kv entries with a true value. |
|
0
|
|
|
|
|
|
|
101
|
0
|
|
|
|
|
|
( sort keys %$alias ); |
102
|
|
|
|
|
|
|
} else { |
103
|
0
|
|
|
|
|
|
$_ |
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
} @aliases; |
106
|
|
|
|
|
|
|
|
107
|
0
|
|
|
|
|
|
@aliases = tidy_arrayify( @aliases ); |
108
|
|
|
|
|
|
|
|
109
|
0
|
0
|
|
|
|
|
$fbo{alias} = [@aliases] if scalar(@aliases); |
110
|
0
|
0
|
0
|
|
|
|
$_{handles} = +{ @handles, %{ $_{handles} // +{} } } if scalar(@handles); |
|
0
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
# Final determination of fallback setup status (enabled or disabled) |
114
|
0
|
|
0
|
|
|
|
my $enabled = ($fbo_detected || !!%fbo) && !exists($_{default}); # && !$disabled; |
115
|
0
|
|
0
|
|
|
|
$enabled //= 0; |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
# say STDERR "Fallback setup for attribute '$name' status : { enabled => $enabled } : " . np %fbo; |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
# Do the actual fallback setup. |
120
|
0
|
0
|
|
|
|
|
if ( $enabled ) { |
121
|
|
|
|
|
|
|
# say STDERR " ==> Setting up a 'default' subroutine for '$name' since { enabled => $enabled }"; |
122
|
|
|
|
|
|
|
# $fbo{metam} //= +{%_}; |
123
|
0
|
|
0
|
|
|
|
$fbo{isam} //= "$_{isa}"; # We need the stringification! Somehow, at this point MungeHas manages to make this into an oject. |
124
|
0
|
|
0
|
|
|
|
$fbo{name} //= "$name"; |
125
|
0
|
|
0
|
|
|
|
my $m = $fbo{method} // '_fallback'; |
126
|
|
|
|
|
|
|
$_{lazy} //= 1, |
127
|
0
|
|
|
0
|
|
|
$_{default} = sub { $_[0]->$m( \%fbo ) } |
128
|
0
|
|
0
|
|
|
|
} |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
#'.. cannot have a lazy attribute without specifying a default' |
131
|
0
|
0
|
|
|
|
|
delete($_{lazy}) unless exists $_{default}; |
132
|
|
|
|
|
|
|
|
133
|
0
|
0
|
|
|
|
|
wantarray ? (%_) : +{%_} |
134
|
|
|
|
|
|
|
} |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
1; |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=pod |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
=encoding UTF-8 |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
=head1 NAME |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
Banal::Moosy::Mungers::DeviseFallbacks - Provide several MUNGER functions that may be use in conjunction with C. |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
=head1 VERSION |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
version 0.001 |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=head1 SYNOPSIS |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
=head1 DESCRIPTION |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
=for stopwords haz ro |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
use Moose; |
157
|
|
|
|
|
|
|
use MooseX::MungeHas { |
158
|
|
|
|
|
|
|
haz => [ sub {; mhs_specs( is => 'ro', init_arg => undef, lazy => 1 ) }, |
159
|
|
|
|
|
|
|
sub {; mhs_fallbacks() }, |
160
|
|
|
|
|
|
|
] |
161
|
|
|
|
|
|
|
}; |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
=for stopwords TABULO |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
This module provides several mungers that may be use in conjunction with C. |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=head2 EXPORT_OK |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=over 4 |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
=item * |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
mhs_fallbacks |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
=back |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=head1 SUPPORT |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
Bugs may be submitted through L |
180
|
|
|
|
|
|
|
(or L). |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=head1 AUTHOR |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
Tabulo |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
This software is copyright (c) 2018 by Tabulo. |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
This is free software; you can redistribute it and/or modify it under |
191
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself. |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
=cut |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
__END__ |