use strict;
use warnings;
+use Class::Load qw(load_class);
use Class::MOP;
-
use Carp qw( confess );
use Data::OptList;
use List::Util qw( first );
my $params = @_ == 1 ? $_[0] : {@_};
my $object = $self->SUPER::new_object($params);
+ $self->_call_all_triggers($object, $params);
+
+ $object->BUILDALL($params) if $object->can('BUILDALL');
+
+ return $object;
+}
+
+sub _call_all_triggers {
+ my ($self, $object, $params) = @_;
+
foreach my $attr ( $self->get_all_attributes() ) {
next unless $attr->can('has_trigger') && $attr->has_trigger;
my $init_arg = $attr->init_arg;
-
next unless defined $init_arg;
-
next unless exists $params->{$init_arg};
$attr->trigger->(
),
);
}
-
- $object->BUILDALL($params) if $object->can('BUILDALL');
-
- return $object;
}
sub _generate_fallback_constructor {
my $supers = Data::OptList::mkopt(\@_);
foreach my $super (@{ $supers }) {
my ($name, $opts) = @{ $super };
- Class::MOP::load_class($name, $opts);
+ load_class($name, $opts);
my $meta = Class::MOP::class_of($name);
$self->throw_error("You cannot inherit from a Moose Role ($name)")
if $meta && $meta->isa('Moose::Meta::Role')
);
}
+sub _fixup_attributes_after_rebless {
+ my $self = shift;
+ my ($instance, $rebless_from, %params) = @_;
+
+ $self->SUPER::_fixup_attributes_after_rebless(
+ $instance,
+ $rebless_from,
+ %params
+ );
+
+ $self->_call_all_triggers( $instance, \%params );
+}
+
## -------------------------------------------------
our $error_level;
my $class = ref $self ? $self->error_class : "Moose::Error::Default";
- Class::MOP::load_class($class);
+ load_class($class);
$class->new(
Carp::caller_info($args{depth}),
my $class = ref $self ? $self->error_class : "Moose::Error::Default";
- Class::MOP::load_class($class);
+ load_class($class);
# don't check inheritance here - the intention is that the class needs
# to provide a non-inherited inlining method, because falling back to
# the default inlining method is most likely going to be wrong
# yes, this is a huge hack, but so is the entire error system, so.
- return '$meta->create_error(' . $msg . ', ' . $args . ');'
+ return
+ '$meta->create_error('
+ . $msg
+ . ( defined $args ? ', ' . $args : q{} ) . ');'
unless $class->meta->has_method('_inline_new');
$class->_inline_new(
argument, but the option hash reference can also contain any other
role relevant values like exclusions or parameterized role arguments.
-=item B<< $metaclass->make_immutable(%options) >>
-
-This overrides the parent's method to add a few options. Specifically,
-it uses the Moose-specific constructor and destructor classes, and
-enables inlining the destructor.
-
-Since Moose always inlines attributes, it sets the C<inline_accessors> option
-to false.
-
=item B<< $metaclass->new_object(%params) >>
This overrides the parent's method in order to add support for