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