Duplicate 19423 (pathological hashes too easy) into hv_store_ent
[p5sagit/p5-mst-13.2.git] / pod / perlobj.pod
index d1938ab..73b67de 100644 (file)
@@ -7,7 +7,7 @@ perlobj - Perl objects
 First you need to understand what references are in Perl.
 See L<perlref> for that.  Second, if you still find the following
 reference work too complicated, a tutorial on object-oriented programming
-in Perl can be found in L<perltoot> and L<perltootc>.
+in Perl can be found in L<perltoot> and L<perltooc>.
 
 If you're still with us, then
 here are three very simple definitions that you should find reassuring.
@@ -200,7 +200,7 @@ methods and instance methods.
 A class method expects a class name as the first argument.  It
 provides functionality for the class as a whole, not for any
 individual object belonging to the class.  Constructors are often
-class methods, but see L<perltoot> and L<perltootc> for alternatives.
+class methods, but see L<perltoot> and L<perltooc> for alternatives.
 Many class methods simply ignore their first argument, because they
 already know what package they're in and don't care what package
 they were invoked via.  (These aren't necessarily the same, because
@@ -361,21 +361,41 @@ are inherited by all other classes:
 
 C<isa> returns I<true> if its object is blessed into a subclass of C<CLASS>
 
-C<isa> is also exportable and can be called as a sub with two arguments. This
-allows the ability to check what a reference points to. Example
+You can also call C<UNIVERSAL::isa> as a subroutine with two arguments.
+The first does not need to be an object or even a reference.  This
+allows you to check what a reference points to, or whether
+something is a reference of a given type. Example
 
-    use UNIVERSAL qw(isa);
-
-    if(isa($ref, 'ARRAY')) {
+    if(UNIVERSAL::isa($ref, 'ARRAY')) {
        #...
     }
 
+To determine if a reference is a blessed object, you can write
+
+    print "It's an object\n" if UNIVERSAL::isa($val, 'UNIVERSAL');
+
 =item can(METHOD)
 
 C<can> checks to see if its object has a method called C<METHOD>,
 if it does then a reference to the sub is returned, if it does not then
 I<undef> is returned.
 
+C<UNIVERSAL::can> can also be called as a subroutine with two arguments.
+It'll always return I<undef> if its first argument isn't an object or a
+class name.    So here's another way to check if a reference is a
+blessed object
+
+    print "It's still an object\n" if UNIVERSAL::can($val, 'can');
+
+You can also use the C<blessed> function of Scalar::Util:
+
+    use Scalar::Util 'blessed';
+
+    my $blessing = blessed $suspected_object;
+
+C<blessed> returns the name of the package the argument has been
+blessed into, or C<undef>.
+
 =item VERSION( [NEED] )
 
 C<VERSION> returns the version number of the class (package).  If the
@@ -397,8 +417,7 @@ strange effects if the Perl code dynamically changes @ISA in any package.
 
 You may add other methods to the UNIVERSAL class via Perl or XS code.
 You do not need to C<use UNIVERSAL> to make these methods
-available to your program.  This is necessary only if you wish to
-have C<isa> available as a plain subroutine in the current package.
+available to your program (and you should not do so).
 
 =head2 Destructors
 
@@ -540,7 +559,7 @@ breaks the circularities in the self-referential structure.
 =head1 SEE ALSO
 
 A kinder, gentler tutorial on object-oriented programming in Perl can
-be found in L<perltoot>, L<perlbootc> and L<perltootc>.  You should
+be found in L<perltoot>, L<perlboot> and L<perltooc>.  You should
 also check out L<perlbot> for other object tricks, traps, and tips, as
 well as L<perlmodlib> for some style guides on constructing both
 modules and classes.