/usr/share/perl5/Method/Generate/Constructor/Role/StrictConstructor.pm is in libmoox-strictconstructor-perl 0.008-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | use strict; # redundant, but quiets perlcritic
package Method::Generate::Constructor::Role::StrictConstructor;
$Method::Generate::Constructor::Role::StrictConstructor::VERSION = '0.008';
# ABSTRACT: a role to make Moo constructors strict.
use Moo::Role;
use B ();
#
# The gist of this code was copied directly from Dave Rolsky's (DROLSKY)
# MooseX::StrictConstructor, specifically from
# MooseX::StrictConstructor::Trait::Method::Constructor as a modifier around
# _generate_BUILDALL. It has diverged only slightly to handle Moo-specific
# differences.
#
around _assign_new => sub {
my $orig = shift;
my $self = shift;
my $spec = $_[0];
my @attrs = map { B::perlstring($_) . ' => undef,' }
grep {defined}
map { $_->{init_arg} } ## no critic (ProhibitAccessOfPrivateData)
values(%$spec);
my $state = ($] >= 5.010) ? "use feature 'state'; state" : "my";
my $body .= <<"EOF";
# MooX::StrictConstructor
$state \$attrs = { @attrs };
my \@bad = sort grep { ! exists \$attrs->{\$_} } keys \%{ \$args };
if (\@bad) {
Carp::confess("Found unknown attribute(s) passed to the constructor: " .
join ", ", \@bad);
}
EOF
$body .= $self->$orig(@_);
return $body;
};
1;
__END__
=pod
=head1 NAME
Method::Generate::Constructor::Role::StrictConstructor - a role to make Moo constructors strict.
=head1 VERSION
version 0.008
=head1 DESCRIPTION
This role wraps L<Method::Generate::Constructor/_assign_new> with a bit of code
that ensures that all arguments passed to the constructor are valid init_args
for the class.
=head2 STANDING ON THE SHOULDERS OF ...
This code would not exist without the examples in L<MooX::InsideOut> and
L<MooseX::StrictConstructor>.
=head1 SEE ALSO
=over 4
=item *
L<MooX::InsideOut>
=item *
L<MooseX::StrictConstructor>
=back
=head1 AUTHOR
George Hartzell <hartzell@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by George Hartzell.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|