add stubs for BUILD and DEMOLISH to Moose::Object
[gitmo/Moose.git] / lib / Moose / Object.pm
CommitLineData
fcd84ca9 1
2package Moose::Object;
3
4use strict;
5use warnings;
648e79ae 6
f25f9912 7use Devel::GlobalDestruction ();
8use MRO::Compat ();
9use Scalar::Util ();
10use Try::Tiny ();
2eaf25da 11
9922fa6f 12use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class';
13use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class';
bc1e29b5 14
870d0f1a 15our $VERSION = '0.94';
e606ae5f 16$VERSION = eval $VERSION;
d44714be 17our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 18
19sub new {
2c0cbef7 20 my $class = shift;
62c8675e 21
e606ae5f 22 my $params = $class->BUILDARGS(@_);
2eaf25da 23
f25f9912 24 my $real_class = Scalar::Util::blessed($class) || $class;
2eaf25da 25 my $self = Class::MOP::Class->initialize($real_class)->new_object($params);
26
e606ae5f 27 $self->BUILDALL($params);
2eaf25da 28
e606ae5f 29 return $self;
30}
31
32sub BUILDARGS {
33 my $class = shift;
a62dcd43 34 if ( scalar @_ == 1 ) {
35 unless ( defined $_[0] && ref $_[0] eq 'HASH' ) {
46047bea 36 Class::MOP::class_of($class)->throw_error(
a62dcd43 37 "Single parameters to new() must be a HASH ref",
38 data => $_[0] );
86629f93 39 }
a62dcd43 40 return { %{ $_[0] } };
41 }
8a157bab 42 else {
e606ae5f 43 return {@_};
8a157bab 44 }
fcd84ca9 45}
46
c0e30cf5 47sub BUILDALL {
d03bd989 48 # NOTE: we ask Perl if we even
d44714be 49 # need to do this first, to avoid
50 # extra meta level calls
c310bfa0 51 return if $_[0]->can('BUILD') == \&BUILD;
fb1e11d5 52 my ($self, $params) = @_;
505033d9 53 foreach my $method (reverse Class::MOP::class_of($self)->find_all_methods_by_name('BUILD')) {
c310bfa0 54 next if $method->{class} eq __PACKAGE__;
b8f014e7 55 $method->{code}->execute($self, $params);
fb1e11d5 56 }
c0e30cf5 57}
58
c310bfa0 59sub BUILD { }
60
c0e30cf5 61sub DEMOLISHALL {
8955a780 62 my $self = shift;
d9359278 63 my ($in_global_destruction) = @_;
8955a780 64
65 # NOTE: we ask Perl if we even
cb5c79c9 66 # need to do this first, to avoid
8955a780 67 # extra meta level calls
c310bfa0 68 return if $self->can('DEMOLISH') == \&DEMOLISH;
8955a780 69
2bc1eab6 70 my @isa;
71 if ( my $meta = Class::MOP::class_of($self ) ) {
72 @isa = $meta->linearized_isa;
73 } else {
74 # We cannot count on being able to retrieve a previously made
75 # metaclass, _or_ being able to make a new one during global
76 # destruction. However, we should still be able to use mro at
77 # that time (at least tests suggest so ;)
78 my $class_name = ref $self;
79 @isa = @{ mro::get_linear_isa($class_name) }
80 }
81
82 foreach my $class (@isa) {
c063fc8b 83 no strict 'refs';
c310bfa0 84 next if $class eq __PACKAGE__;
c063fc8b 85 my $demolish = *{"${class}::DEMOLISH"}{CODE};
86 $self->$demolish($in_global_destruction)
87 if defined $demolish;
3a0c064a 88 }
89}
90
c310bfa0 91sub DEMOLISH { }
92
d03bd989 93sub DESTROY {
b288593e 94 my $self = shift;
95
96 local $?;
97
f25f9912 98 Try::Tiny::try {
99 $self->DEMOLISHALL(Devel::GlobalDestruction::in_global_destruction);
b288593e 100 }
f25f9912 101 Try::Tiny::catch {
b288593e 102 # Without this, Perl will warn "\t(in cleanup)$@" because of some
103 # bizarre fucked-up logic deep in the internals.
104 no warnings 'misc';
105 die $_;
106 };
107
c989424b 108 return;
c0e30cf5 109}
110
e606ae5f 111# support for UNIVERSAL::DOES ...
112BEGIN {
113 my $does = UNIVERSAL->can("DOES") ? "SUPER::DOES" : "isa";
114 eval 'sub DOES {
115 my ( $self, $class_or_role_name ) = @_;
116 return $self->'.$does.'($class_or_role_name)
117 || $self->does($class_or_role_name);
118 }';
119}
120
d03bd989 121# new does() methods will be created
50bc108b 122# as appropiate see Moose::Meta::Role
0677220d 123sub does {
bdabd620 124 my ($self, $role_name) = @_;
66d33a5c 125 my $meta = Class::MOP::class_of($self);
be05faea 126 (defined $role_name)
d9de4f04 127 || $meta->throw_error("You must supply a role name to does()");
b82ef9c3 128 return 1 if $meta->can('does_role') && $meta->does_role($role_name);
d03bd989 129 return 0;
0677220d 130}
ef333f17 131
d03bd989 132sub dump {
f742dfef 133 my $self = shift;
134 require Data::Dumper;
1a386a6c 135 local $Data::Dumper::Maxdepth = shift if @_;
f742dfef 136 Data::Dumper::Dumper $self;
137}
138
fcd84ca9 1391;
140
141__END__
142
143=pod
144
145=head1 NAME
146
e522431d 147Moose::Object - The base object for Moose
fcd84ca9 148
fcd84ca9 149=head1 DESCRIPTION
150
080e3614 151This class is the default base class for all Moose-using classes. When
152you C<use Moose> in this class, your class will inherit from this
153class.
6ba6d68c 154
080e3614 155It provides a default constructor and destructor, which run the
156C<BUILDALL> and C<DEMOLISHALL> methods respectively.
157
158You don't actually I<need> to inherit from this in order to use Moose,
159but it makes it easier to take advantage of all of Moose's features.
6ba6d68c 160
fcd84ca9 161=head1 METHODS
162
163=over 4
164
080e3614 165=item B<< Moose::Object->new(%params) >>
166
167This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new
168instance of the appropriate class. Once the instance is created, it
169calls C<< $instance->BUILDALL($params) >>.
fcd84ca9 170
080e3614 171=item B<< Moose::Object->BUILDARGS(%params) >>
6ba6d68c 172
080e3614 173The default implementation of this method accepts a hash or hash
174reference of named parameters. If it receives a single argument that
175I<isn't> a hash reference it throws an error.
fcd84ca9 176
080e3614 177You can override this method in your class to handle other types of
178options passed to the constructor.
e606ae5f 179
080e3614 180This method should always return a hash reference of named options.
e606ae5f 181
080e3614 182=item B<< $object->BUILDALL($params) >>
e522431d 183
080e3614 184This method will call every C<BUILD> method in the inheritance
185hierarchy, starting with the most distant parent class and ending with
186the object's class.
c0e30cf5 187
080e3614 188The C<BUILD> method will be passed the hash reference returned by
189C<BUILDARGS>.
e522431d 190
080e3614 191=item B<< $object->DEMOLISHALL >>
c0e30cf5 192
080e3614 193This will call every C<DEMOLISH> method in the inheritance hierarchy,
194starting with the object's class and ending with the most distant
c3fdacda 195parent. C<DEMOLISHALL> and C<DEMOLISH> will receive a boolean
196indicating whether or not we are currently in global destruction.
e522431d 197
080e3614 198=item B<< $object->does($role_name) >>
ef333f17 199
080e3614 200This returns true if the object does the given role.
02a0fb52 201
e606ae5f 202=item B<DOES ($class_or_role_name)>
203
080e3614 204This is a a Moose role-aware implementation of L<UNIVERSAL/DOES>.
e606ae5f 205
080e3614 206This is effectively the same as writing:
e606ae5f 207
080e3614 208 $object->does($name) || $object->isa($name)
f742dfef 209
080e3614 210This method will work with Perl 5.8, which did not implement
211C<UNIVERSAL::DOES>.
f742dfef 212
080e3614 213=item B<< $object->dump($maxdepth) >>
f742dfef 214
080e3614 215This is a handy utility for C<Data::Dumper>ing an object. By default,
216the maximum depth is 1, to avoid making a mess.
f742dfef 217
fcd84ca9 218=back
219
220=head1 BUGS
221
d4048ef3 222See L<Moose/BUGS> for details on reporting bugs.
fcd84ca9 223
fcd84ca9 224=head1 AUTHOR
225
226Stevan Little E<lt>stevan@iinteractive.comE<gt>
227
228=head1 COPYRIGHT AND LICENSE
229
7e0492d3 230Copyright 2006-2010 by Infinity Interactive, Inc.
fcd84ca9 231
232L<http://www.iinteractive.com>
233
234This library is free software; you can redistribute it and/or modify
d03bd989 235it under the same terms as Perl itself.
fcd84ca9 236
9922fa6f 237=cut