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}
101 return unless $self->can('DEMOLISH');
106 if ( my $meta = Mouse::class_of($self) ) {
107 @isa = $meta->linearized_isa;
109 # We cannot count on being able to retrieve a previously made
110 # metaclass, _or_ being able to make a new one during global
111 # destruction. However, we should still be able to use mro at
112 # that time (at least tests suggest so ;)
113 my $class_name = ref $self;
114 @isa = @{ Mouse::Util::get_linear_isa($class_name) }
117 foreach my $class (@isa) {
119 my $demolish = *{"${class}::DEMOLISH"}{CODE};
121 if defined $demolish;
127 require Data::Dumper;
128 local $Data::Dumper::Maxdepth = shift if @_;
129 Data::Dumper::Dumper $self;
134 my ($self, $role_name) = @_;
136 || confess "You must supply a role name to does()";
137 my $meta = $self->meta;
138 foreach my $class ($meta->linearized_isa) {
139 my $m = $meta->initialize($class);
141 if $m->can('does_role') && $m->does_role($role_name);
152 Mouse::Object - we don't need to steenkin' constructor
156 =head2 new arguments -> object
158 Instantiates a new Mouse::Object. This is obviously intended for subclasses.
160 =head2 BUILDALL \%args
162 Calls L</BUILD> on each class in the class hierarchy. This is called at the
167 You may put any business logic initialization in BUILD methods. You don't
168 need to redispatch or return any specific value.
172 Lets you override the arguments that C<new> takes. Return a hashref of
177 Calls L</DEMOLISH> on each class in the class hierarchy. This is called at
182 You may put any business logic deinitialization in DEMOLISH methods. You don't
183 need to redispatch or return any specific value.
186 =head2 does $role_name
188 This will check if the invocant's class "does" a given C<$role_name>.
189 This is similar to "isa" for object, but it checks the roles instead.
192 =head2 B<dump ($maxdepth)>
196 C'mon, how many times have you written the following code while debugging:
201 It can get seriously annoying, so why not just use this.
203 The implementation was lifted directly from Moose::Object.