5 use Scalar::Util 'weaken';
11 my $args = $class->BUILDARGS(@_);
13 my $instance = bless {}, $class;
15 for my $attribute ($class->meta->get_all_attributes) {
16 my $from = $attribute->init_arg;
17 my $key = $attribute->name;
19 if (defined($from) && exists($args->{$from})) {
20 $args->{$from} = $attribute->coerce_constraint($args->{$from})
21 if $attribute->should_coerce;
22 $attribute->verify_against_type_constraint($args->{$from});
24 $instance->{$key} = $args->{$from};
26 weaken($instance->{$key})
27 if ref($instance->{$key}) && $attribute->is_weak_ref;
29 if ($attribute->has_trigger) {
30 $attribute->trigger->($instance, $args->{$from});
34 if ($attribute->has_default || $attribute->has_builder) {
35 unless ($attribute->is_lazy) {
36 my $default = $attribute->default;
37 my $builder = $attribute->builder;
38 my $value = $attribute->has_builder
40 : ref($default) eq 'CODE'
41 ? $default->($instance)
44 $value = $attribute->coerce_constraint($value)
45 if $attribute->should_coerce;
46 $attribute->verify_against_type_constraint($value);
48 $instance->{$key} = $value;
50 weaken($instance->{$key})
51 if ref($instance->{$key}) && $attribute->is_weak_ref;
55 if ($attribute->is_required) {
56 confess "Attribute (".$attribute->name.") is required";
62 $instance->BUILDALL($args);
71 (ref($_[0]) eq 'HASH')
72 || confess "Single parameters to new() must be a HASH ref";
80 sub DESTROY { shift->DEMOLISHALL }
86 return unless $self->can('BUILD');
88 for my $class (reverse $self->meta->linearized_isa) {
91 my $code = *{ $class . '::BUILD' }{CODE}
102 return unless $self->can('DEMOLISH');
107 if ( my $meta = Mouse::Meta::Class::class_of($self) ) {
108 @isa = $meta->linearized_isa;
110 # We cannot count on being able to retrieve a previously made
111 # metaclass, _or_ being able to make a new one during global
112 # destruction. However, we should still be able to use mro at
113 # that time (at least tests suggest so ;)
114 my $class_name = ref $self;
115 @isa = @{ Mouse::Util::get_linear_isa($class_name) }
118 foreach my $class (@isa) {
120 my $demolish = *{"${class}::DEMOLISH"}{CODE};
122 if defined $demolish;
129 require Data::Dumper;
130 local $Data::Dumper::Maxdepth = shift if @_;
131 Data::Dumper::Dumper($self);
136 my ($self, $role_name) = @_;
138 || confess "You must supply a role name to does()";
140 my $meta = $self->meta;
141 foreach my $class ($meta->linearized_isa) {
142 my $m = ref($meta)->initialize($class);
144 if $m->can('does_role') && $m->does_role($role_name);
155 Mouse::Object - we don't need to steenkin' constructor
159 =head2 new arguments -> object
161 Instantiates a new Mouse::Object. This is obviously intended for subclasses.
163 =head2 BUILDALL \%args
165 Calls L</BUILD> on each class in the class hierarchy. This is called at the
170 You may put any business logic initialization in BUILD methods. You don't
171 need to redispatch or return any specific value.
175 Lets you override the arguments that C<new> takes. Return a hashref of
180 Calls L</DEMOLISH> on each class in the class hierarchy. This is called at
185 You may put any business logic deinitialization in DEMOLISH methods. You don't
186 need to redispatch or return any specific value.
189 =head2 does $role_name
191 This will check if the invocant's class "does" a given C<$role_name>.
192 This is similar to "isa" for object, but it checks the roles instead.
195 =head2 B<dump ($maxdepth)>
199 C'mon, how many times have you written the following code while debugging:
204 It can get seriously annoying, so why not just use this.
206 The implementation was lifted directly from Moose::Object.