From: Jesse Luehrs Date: Fri, 22 Apr 2011 16:12:39 +0000 (-0500) Subject: this shouldn't be using a base class role at all X-Git-Tag: v0.16~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=709eccb9a7dd3ee9cad8f3d8f9bd3aea5ac3e44a;p=gitmo%2FMooseX-StrictConstructor.git this shouldn't be using a base class role at all also, "after BUILDALL" is terrible --- diff --git a/lib/MooseX/StrictConstructor.pm b/lib/MooseX/StrictConstructor.pm index c68d279..40fa4bb 100644 --- a/lib/MooseX/StrictConstructor.pm +++ b/lib/MooseX/StrictConstructor.pm @@ -6,7 +6,6 @@ use warnings; use Moose 0.94 (); use Moose::Exporter; use Moose::Util::MetaRole; -use MooseX::StrictConstructor::Role::Object; { my %class_meta = ( class => ['MooseX::StrictConstructor::Trait::Class'] ); @@ -19,8 +18,7 @@ use MooseX::StrictConstructor::Role::Object; } Moose::Exporter->setup_import_methods( - class_metaroles => \%class_meta, - base_class_roles => ['MooseX::StrictConstructor::Role::Object'], + class_metaroles => \%class_meta, ); } diff --git a/lib/MooseX/StrictConstructor/Role/Object.pm b/lib/MooseX/StrictConstructor/Role/Object.pm deleted file mode 100644 index 4b5a765..0000000 --- a/lib/MooseX/StrictConstructor/Role/Object.pm +++ /dev/null @@ -1,51 +0,0 @@ -package MooseX::StrictConstructor::Role::Object; - -use Moose::Role; - -use namespace::autoclean; - -after 'BUILDALL' => sub { - my $self = shift; - my $params = shift; - - my %attrs = ( - __INSTANCE__ => 1, - map { $_ => 1 } - grep {defined} - map { $_->init_arg() } $self->meta()->get_all_attributes() - ); - - my @bad = sort grep { !$attrs{$_} } keys %{$params}; - - if (@bad) { - Moose->throw_error( - "Found unknown attribute(s) init_arg passed to the constructor: @bad"); - } - - return; -}; - -1; - -# ABSTRACT: A role which implements a strict constructor for Moose::Object - -__END__ - -=pod - -=head1 SYNOPSIS - - Moose::Util::MetaRole::apply_base_class_roles( - for_class => $caller, - roles => - ['MooseX::StrictConstructor::Role::Object'], - ); - -=head1 DESCRIPTION - -When you use C, your objects will have this -role applied to them. It provides a method modifier for C -from C that implements strict argument checking for -your class. - -=cut diff --git a/lib/MooseX/StrictConstructor/Trait/Class.pm b/lib/MooseX/StrictConstructor/Trait/Class.pm index 579b6c2..99803d2 100644 --- a/lib/MooseX/StrictConstructor/Trait/Class.pm +++ b/lib/MooseX/StrictConstructor/Trait/Class.pm @@ -6,6 +6,30 @@ use namespace::autoclean; use B (); +around new_object => sub { + my $orig = shift; + my $self = shift; + my $params = @_ == 1 ? $_[0] : {@_}; + my $instance = $self->$orig(@_); + + my %attrs = ( + __INSTANCE__ => 1, + (map { $_ => 1 } + grep { defined } + map { $_->init_arg } + $self->get_all_attributes) + ); + + my @bad = sort grep { !$attrs{$_} } keys %$params; + + if (@bad) { + $self->throw_error( + "Found unknown attribute(s) init_arg passed to the constructor: @bad"); + } + + return $instance; +}; + around '_inline_BUILDALL' => sub { my $orig = shift; my $self = shift; @@ -29,19 +53,6 @@ around '_inline_BUILDALL' => sub { ); } if $Moose::VERSION >= 1.9900; -# If the base class role is applied first, and then a superclass is added, we -# lose the role. -after superclasses => sub { - my $self = shift; - - return unless @_; - - Moose::Util::MetaRole::apply_base_class_roles( - for => $self->name(), - roles => ['MooseX::StrictConstructor::Role::Object'], - ); -}; - 1; # ABSTRACT: A role to make immutable constructors strict