update changes
[gitmo/Moose.git] / lib / Moose / Object.pm
CommitLineData
fcd84ca9 1
2package Moose::Object;
3
4use strict;
5use warnings;
648e79ae 6
2eaf25da 7use Scalar::Util;
5d399b5d 8use Devel::GlobalDestruction ();
2eaf25da 9
9922fa6f 10use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class';
11use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class';
bc1e29b5 12
be21cc5c 13our $VERSION = '0.76';
e606ae5f 14$VERSION = eval $VERSION;
d44714be 15our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 16
17sub new {
2c0cbef7 18 my $class = shift;
2eaf25da 19
e606ae5f 20 my $params = $class->BUILDARGS(@_);
2eaf25da 21
22 # We want to support passing $self->new, but initialize
23 # takes only an unblessed class name
24 my $real_class = Scalar::Util::blessed($class) || $class;
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
d03bd989 51 return unless $_[0]->can('BUILD');
fb1e11d5 52 my ($self, $params) = @_;
505033d9 53 foreach my $method (reverse Class::MOP::class_of($self)->find_all_methods_by_name('BUILD')) {
b8f014e7 54 $method->{code}->execute($self, $params);
fb1e11d5 55 }
c0e30cf5 56}
57
58sub DEMOLISHALL {
8955a780 59 my $self = shift;
d9359278 60 my ($in_global_destruction) = @_;
8955a780 61
62 # NOTE: we ask Perl if we even
cb5c79c9 63 # need to do this first, to avoid
8955a780 64 # extra meta level calls
cb5c79c9 65 return unless $self->can('DEMOLISH');
8955a780 66
67 # This is a hack, because Moose::Meta::Class may not be the right
68 # metaclass, but class_of may return undef during global
69 # destruction, if the metaclass object has already been cleaned
70 # up.
71 my $meta = Class::MOP::class_of($self)
72 || Moose::Meta::Class->initialize( ref $self );
73
74 foreach my $method ( $meta->find_all_methods_by_name('DEMOLISH') ) {
d9359278 75 $method->{code}->execute($self, $in_global_destruction);
3a0c064a 76 }
77}
78
d03bd989 79sub DESTROY {
3a0c064a 80 # if we have an exception here ...
ca0e380d 81 if ($@) {
82 # localize the $@ ...
83 local $@;
3a0c064a 84 # run DEMOLISHALL ourselves, ...
5d399b5d 85 $_[0]->DEMOLISHALL(Devel::GlobalDestruction::in_global_destruction);
3a0c064a 86 # and return ...
87 return;
88 }
ca0e380d 89 # otherwise it is normal destruction
5d399b5d 90 $_[0]->DEMOLISHALL(Devel::GlobalDestruction::in_global_destruction);
c0e30cf5 91}
92
e606ae5f 93# support for UNIVERSAL::DOES ...
94BEGIN {
95 my $does = UNIVERSAL->can("DOES") ? "SUPER::DOES" : "isa";
96 eval 'sub DOES {
97 my ( $self, $class_or_role_name ) = @_;
98 return $self->'.$does.'($class_or_role_name)
99 || $self->does($class_or_role_name);
100 }';
101}
102
d03bd989 103# new does() methods will be created
50bc108b 104# as appropiate see Moose::Meta::Role
0677220d 105sub does {
bdabd620 106 my ($self, $role_name) = @_;
66d33a5c 107 my $meta = Class::MOP::class_of($self);
be05faea 108 (defined $role_name)
109 || $meta->throw_error("You much supply a role name to does()");
bdabd620 110 foreach my $class ($meta->class_precedence_list) {
587e457d 111 my $m = $meta->initialize($class);
d03bd989 112 return 1
113 if $m->can('does_role') && $m->does_role($role_name);
bdabd620 114 }
d03bd989 115 return 0;
0677220d 116}
ef333f17 117
d03bd989 118sub dump {
f742dfef 119 my $self = shift;
120 require Data::Dumper;
1a386a6c 121 local $Data::Dumper::Maxdepth = shift if @_;
f742dfef 122 Data::Dumper::Dumper $self;
123}
124
fcd84ca9 1251;
126
127__END__
128
129=pod
130
131=head1 NAME
132
e522431d 133Moose::Object - The base object for Moose
fcd84ca9 134
fcd84ca9 135=head1 DESCRIPTION
136
080e3614 137This class is the default base class for all Moose-using classes. When
138you C<use Moose> in this class, your class will inherit from this
139class.
6ba6d68c 140
080e3614 141It provides a default constructor and destructor, which run the
142C<BUILDALL> and C<DEMOLISHALL> methods respectively.
143
144You don't actually I<need> to inherit from this in order to use Moose,
145but it makes it easier to take advantage of all of Moose's features.
6ba6d68c 146
fcd84ca9 147=head1 METHODS
148
149=over 4
150
080e3614 151=item B<< Moose::Object->new(%params) >>
152
153This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new
154instance of the appropriate class. Once the instance is created, it
155calls C<< $instance->BUILDALL($params) >>.
fcd84ca9 156
080e3614 157=item B<< Moose::Object->BUILDARGS(%params) >>
6ba6d68c 158
080e3614 159The default implementation of this method accepts a hash or hash
160reference of named parameters. If it receives a single argument that
161I<isn't> a hash reference it throws an error.
fcd84ca9 162
080e3614 163You can override this method in your class to handle other types of
164options passed to the constructor.
e606ae5f 165
080e3614 166This method should always return a hash reference of named options.
e606ae5f 167
080e3614 168=item B<< $object->BUILDALL($params) >>
e522431d 169
080e3614 170This method will call every C<BUILD> method in the inheritance
171hierarchy, starting with the most distant parent class and ending with
172the object's class.
c0e30cf5 173
080e3614 174The C<BUILD> method will be passed the hash reference returned by
175C<BUILDARGS>.
e522431d 176
080e3614 177=item B<< $object->DEMOLISHALL >>
c0e30cf5 178
080e3614 179This will call every C<DEMOLISH> method in the inheritance hierarchy,
180starting with the object's class and ending with the most distant
c3fdacda 181parent. C<DEMOLISHALL> and C<DEMOLISH> will receive a boolean
182indicating whether or not we are currently in global destruction.
e522431d 183
080e3614 184=item B<< $object->does($role_name) >>
ef333f17 185
080e3614 186This returns true if the object does the given role.
02a0fb52 187
e606ae5f 188=item B<DOES ($class_or_role_name)>
189
080e3614 190This is a a Moose role-aware implementation of L<UNIVERSAL/DOES>.
e606ae5f 191
080e3614 192This is effectively the same as writing:
e606ae5f 193
080e3614 194 $object->does($name) || $object->isa($name)
f742dfef 195
080e3614 196This method will work with Perl 5.8, which did not implement
197C<UNIVERSAL::DOES>.
f742dfef 198
080e3614 199=item B<< $object->dump($maxdepth) >>
f742dfef 200
080e3614 201This is a handy utility for C<Data::Dumper>ing an object. By default,
202the maximum depth is 1, to avoid making a mess.
f742dfef 203
fcd84ca9 204=back
205
206=head1 BUGS
207
d03bd989 208All complex software has bugs lurking in it, and this module is no
fcd84ca9 209exception. If you find a bug please either email me, or add the bug
210to cpan-RT.
211
fcd84ca9 212=head1 AUTHOR
213
214Stevan Little E<lt>stevan@iinteractive.comE<gt>
215
216=head1 COPYRIGHT AND LICENSE
217
2840a3b2 218Copyright 2006-2009 by Infinity Interactive, Inc.
fcd84ca9 219
220L<http://www.iinteractive.com>
221
222This library is free software; you can redistribute it and/or modify
d03bd989 223it under the same terms as Perl itself.
fcd84ca9 224
9922fa6f 225=cut