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 return $self->meta->does_role($role_name);
149 Mouse::Object - we don't need to steenkin' constructor
153 =head2 new arguments -> object
155 Instantiates a new Mouse::Object. This is obviously intended for subclasses.
157 =head2 BUILDALL \%args
159 Calls L</BUILD> on each class in the class hierarchy. This is called at the
164 You may put any business logic initialization in BUILD methods. You don't
165 need to redispatch or return any specific value.
169 Lets you override the arguments that C<new> takes. Return a hashref of
174 Calls L</DEMOLISH> on each class in the class hierarchy. This is called at
179 You may put any business logic deinitialization in DEMOLISH methods. You don't
180 need to redispatch or return any specific value.
183 =head2 does $role_name
185 This will check if the invocant's class "does" a given C<$role_name>.
186 This is similar to "isa" for object, but it checks the roles instead.
189 =head2 B<dump ($maxdepth)>
193 C'mon, how many times have you written the following code while debugging:
198 It can get seriously annoying, so why not just use this.
200 The implementation was lifted directly from Moose::Object.