redo constructor class as a role too
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor / Role / Constructor.pm
CommitLineData
64c958ef 1package MooseX::StrictConstructor::Role::Constructor;
c001451a 2
3use strict;
4use warnings;
5
5c3f24ed 6use Carp ();
c001451a 7
64c958ef 8use Moose::Role;
c001451a 9
64c958ef 10around '_generate_BUILDALL' => sub
c001451a 11{
64c958ef 12 my $orig = shift;
c001451a 13 my $self = shift;
14
64c958ef 15 my $source = $self->$orig();
5c3f24ed 16 $source .= ";\n" if $source;
c001451a 17
0f795b43 18 my @attrs =
19 ( map { "$_ => 1," }
20 grep { defined }
21 map { $_->init_arg() }
22 @{ $self->attributes() }
23 );
c001451a 24
5c3f24ed 25 $source .= <<"EOF";
26my \%attrs = (@attrs);
c001451a 27
5c40fb22 28my \@bad = sort grep { ! \$attrs{\$_} } keys \%{ \$params };
5c3f24ed 29
30if (\@bad) {
31 Carp::confess "Found unknown attribute(s) passed to the constructor: \@bad";
32}
c001451a 33EOF
34
5c3f24ed 35 return $source;
c001451a 36};
37
64c958ef 38no Moose::Role;
c001451a 39
401;
58370717 41
42__END__
43
44=pod
45
46=head1 NAME
47
48MooseX::StrictConstructor::Meta::Method::Constructor - A meta class to make immutable constructors strict
49
50=head1 SYNOPSIS
51
52 use MooseX::StrictConstructor;
53
54=head1 DESCRIPTION
55
56This class simply overrides C<_generate_BUILDALL()> in
57C<Moose::Meta::Method::Constructor> so that classes that are made
58immutable have a strict constructor.
59
60You should never have to use this class directly.
61
62=head1 AUTHOR
63
64Dave Rolsky, C<< <autarch@urth.org> >>
65
66=head1 COPYRIGHT & LICENSE
67
68Copyright 2007 Dave Rolsky, All Rights Reserved.
69
70This program is free software; you can redistribute it and/or modify
71it under the same terms as Perl itself.
72
73=cut
74