| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Data::MuForm::Meta; |
|
2
|
|
|
|
|
|
|
# ABSTRACT: Meta magic to create 'has_fields' |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
|
|
5
|
83
|
|
|
295
|
|
4061987
|
use Moo::_Utils; |
|
|
83
|
|
|
|
|
125
|
|
|
|
83
|
|
|
|
|
21354
|
|
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
sub import { |
|
8
|
311
|
|
|
498
|
|
176401
|
my $class = shift; |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
# the package into which we're importing |
|
11
|
311
|
|
|
|
|
571
|
my $target = caller; |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
# local meta_fields to package, closed over by the 'around' methods |
|
14
|
311
|
|
|
|
|
512
|
my @_meta_fields; |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
# has_field function which puts the field definitions into the local @_meta_fields |
|
17
|
|
|
|
|
|
|
my $has_field = sub { |
|
18
|
481
|
|
|
635
|
|
49804
|
my ( $name, @options ) = @_; |
|
|
|
|
|
601
|
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
19
|
481
|
50
|
|
|
|
931
|
return unless $name; |
|
20
|
481
|
100
|
|
|
|
956
|
my $names = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; |
|
21
|
481
|
|
|
|
|
1998
|
push @_meta_fields, { name => $_, source => $target, @options } for @$names; |
|
22
|
311
|
|
|
|
|
1302
|
}; |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
# function to insert 'around' modifiers into the calling package |
|
25
|
|
|
|
|
|
|
# install 'has_field' function into the calling package |
|
26
|
311
|
|
|
|
|
1031
|
_install_coderef "${target}::has_field" => "MuMeta::has_field" => $has_field; |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
# eval the basic functions into the caller package. It does not work to do these |
|
29
|
|
|
|
|
|
|
# with '_install_coderef' - C3 gets confused, and they could get cleaned away |
|
30
|
|
|
|
|
|
|
# 'maybe::next::method' necessary to get it to walk the tree |
|
31
|
|
|
|
|
|
|
# Note: _field_packages isn't actually used in MuForm code, but is left here |
|
32
|
|
|
|
|
|
|
# for possible diagnostic use. It will return an array of the packages |
|
33
|
|
|
|
|
|
|
# into which this code was imported. |
|
34
|
311
|
|
|
|
|
21687
|
eval "package ${target}; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
sub _meta_fields { shift->maybe::next::method(\@_) } |
|
36
|
|
|
|
|
|
|
sub _field_packages { shift->maybe::next::method(\@_) }"; |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
# get the 'around' function from the caller |
|
39
|
311
|
|
|
|
|
2321
|
my $around = $target->can('around'); |
|
40
|
|
|
|
|
|
|
# function to create the 'around' functions. Closes around @_meta_fields. |
|
41
|
|
|
|
|
|
|
my $apply_modifiers = sub { |
|
42
|
|
|
|
|
|
|
$around->( |
|
43
|
|
|
|
|
|
|
_meta_fields => sub { |
|
44
|
456
|
|
|
|
|
15399
|
my ($orig, $self) = (shift, shift); |
|
45
|
456
|
|
|
|
|
7340
|
return ($self->$orig(), @_meta_fields); |
|
46
|
|
|
|
|
|
|
} |
|
47
|
311
|
|
|
311
|
|
1238
|
); |
|
48
|
|
|
|
|
|
|
$around->( |
|
49
|
|
|
|
|
|
|
_field_packages => sub { |
|
50
|
0
|
|
|
|
|
0
|
my ($orig, $self) = (shift, shift); |
|
51
|
0
|
|
|
|
|
0
|
my $package = $target; |
|
52
|
0
|
|
|
|
|
0
|
return ($self->$orig(), $package); |
|
53
|
|
|
|
|
|
|
} |
|
54
|
311
|
|
|
|
|
277979
|
); |
|
55
|
311
|
|
|
|
|
1022
|
}; |
|
56
|
|
|
|
|
|
|
# actually install the around modifiers in the caller |
|
57
|
311
|
|
|
|
|
598
|
$apply_modifiers->(); |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
1; |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
__END__ |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=pod |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=encoding UTF-8 |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 NAME |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
Data::MuForm::Meta - Meta magic to create 'has_fields' |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head1 VERSION |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
version 0.03 |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
This file imports the 'has_field' sugar into the MuForm form and field |
|
80
|
|
|
|
|
|
|
packages. |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
Thanks to Matt Trout who provided this method and assistance in |
|
83
|
|
|
|
|
|
|
getting it working. |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head1 NAME |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Data::MuForm::Meta |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
=head1 AUTHOR |
|
90
|
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
Gerda Shank |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
This software is copyright (c) 2017 by Gerda Shank. |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
This is free software; you can redistribute it and/or modify it under |
|
98
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself. |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
=cut |