0.03, C3 reqs and loading mro.pm
[gitmo/MRO-Compat.git] / README
diff --git a/README b/README
index 9e257d7..cecb019 100644 (file)
--- a/README
+++ b/README
-MRO::Compat version 0.02
-===========================
+NAME
+    MRO::Compat - mro::* interface compatibility for Perls < 5.9.5
 
-INSTALLATION
+SYNOPSIS
+       package FooClass; use base qw/X Y Z/;
+       package X;        use base qw/ZZZ/;
+       package Y;        use base qw/ZZZ/;
+       package Z;        use base qw/ZZZ/;
 
-To install this module type the following:
+       package main;
+       use MRO::Compat;
+       my $linear = mro::get_linear_isa('FooClass');
+       print join(q{, }, @$linear);
 
-   perl Makefile.PL
-   make
-   make test
-   make install
+       # Prints: "FooClass, X, ZZZ, Y, Z"
 
-DEPENDENCIES
+DESCRIPTION
+    The "mro" namespace provides several utilities for dealing with method
+    resolution order and method caching in general in Perl 5.9.5 and higher.
 
-   Requires Test::More 0.47 to test
-   Requires Class::C3 0.18 for runtime
-   Recommends Class::C3::XS 0.04 for runtime
+    This module provides those interfaces for earlier versions of Perl (back
+    to 5.6.0 anyways).
 
-COPYRIGHT AND LICENCE
+    It is a harmless no-op to use this module on 5.9.5+. If you're writing a
+    piece of software that would like to use the parts of 5.9.5+'s mro::
+    interfaces that are supported here, and you want compatibility with
+    older Perls, this is the module for you.
 
-Copyright (C) 2007 Brandon L Black <blblack@gmail.com>
+    Some parts of this interface will work better with Class::C3::XS
+    installed, but it's not a requirement.
 
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
+    This module never exports any functions. All calls must be fully
+    qualified with the "mro::" prefix.
+
+    The interface documentation here serves only as a quick reference of
+    what the function basically does, and what differences between
+    MRO::Compat and 5.9.5+ one should look out for. The main docs in 5.9.5's
+    mro are the real interface docs, and contain a lot of other useful
+    information.
+
+VERSION 0.02
+    This is the first release of this new module, and on top of that, the
+    Perl 5.9.5 it seeks to provide compatibility with isn't even out yet.
+
+    If you're going to use/depend on this, please keep abreast of possible
+    interface changes in the next few versions. Once Perl 5.9.5 is out the
+    door the interfaces should stabilize on whatever 5.9.5 has to offer. In
+    the meantime, don't be surprised if MRO::Compat and 5.9.5's interfaces
+    aren't perfectly in sync at all times.
+
+Functions
+  mro::get_linear_isa($classname[, $type])
+    Returns an arrayref which is the linearized MRO of the given class. Uses
+    whichever MRO is currently in effect for that class by default, or the
+    given MRO (either "c3" or "dfs" if specified as $type).
+
+    The linearized MRO of a class is a single ordered list of all of the
+    classes that would be visited in the process of resolving a method on
+    the given class, starting with itself. It does not include any duplicate
+    entries.
+
+    Note that "UNIVERSAL" (and any members of "UNIVERSAL"'s MRO) are not
+    part of the MRO of a class, even though all classes implicitly inherit
+    methods from "UNIVERSAL" and its parents.
+
+  mro::import
+    This allows the "use mro 'dfs'" and "use mro 'c3'" syntaxes, providing
+    you "use MRO::Compat" first. Please see the "USING C3" section for
+    additional details.
+
+  mro::set_mro($classname, $type)
+    Sets the mro of $classname to one of the types "dfs" or "c3". Please see
+    the "USING C3" section for additional details.
+
+  mro::get_mro($classname)
+    Returns the MRO of the given class (either "c3" or "dfs").
+
+    It considers any Class::C3-using class to have C3 MRO even before
+    Class::C3::initialize() is called.
+
+  mro::get_isarev($classname)
+    Returns an arrayref of classes who are subclasses of the given
+    classname. In other words, classes who we exist, however indirectly, in
+    the @ISA inheritancy hierarchy of.
+
+    This is much slower on pre-5.9.5 Perls with MRO::Compat than it is on
+    5.9.5+, as it has to search the entire package namespace.
+
+  mro::is_universal($classname)
+    Returns a boolean status indicating whether or not the given classname
+    is either "UNIVERSAL" itself, or one of "UNIVERSAL"'s parents by @ISA
+    inheritance.
+
+    Any class for which this function returns true is "universal" in the
+    sense that all classes potentially inherit methods from it.
+
+  mro::invalidate_all_method_caches
+    Increments "PL_sub_generation", which invalidates method caching in all
+    packages.
+
+    Please note that this is rarely necessary, unless you are dealing with a
+    situation which is known to confuse Perl's method caching.
+
+  mro::method_changed_in($classname)
+    Invalidates the method cache of any classes dependent on the given
+    class. In MRO::Compat on pre-5.9.5 Perls, this is an alias for
+    "mro::invalidate_all_method_caches" above, as pre-5.9.5 Perls have no
+    other way to do this. It will still enforce the requirement that you
+    pass it a classname, for compatibility.
+
+    Please note that this is rarely necessary, unless you are dealing with a
+    situation which is known to confuse Perl's method caching.
+
+  mro::get_pkg_gen($classname)
+    Returns an integer which is incremented every time a local method of or
+    the @ISA of the given package changes on Perl 5.9.5+. On earlier Perls
+    with this MRO::Compat module, it will probably increment a lot more
+    often than necessary.
+
+USING C3
+    While this module makes the 5.9.5+ syntaxes "use mro 'c3'" and
+    "mro::set_mro("Foo", 'c3')" available on older Perls, it does so merely
+    by passing off the work to Class::C3.
+
+    It does not remove the need for you to call Class::C3's "initialize()",
+    "reinitialize()", and/or "uninitialize()" at the appropriate times as
+    documented in the Class::C3 docs.
+
+    Because MRO::Compat has Class::C3 as a pre-requisite, and requires it at
+    "use" time, you can blindly call those functions in code that uses
+    MRO::Compat. Under 5.9.5+ with MRO::Compat, your calls to those
+    functions will become a no-op and everything will work fine.
+
+SEE ALSO
+    Class::C3
+
+    mro
+
+AUTHOR
+    Brandon L. Black, <blblack@gmail.com>
+
+COPYRIGHT AND LICENSE
+    Copyright 2007 Brandon L. Black <blblack@gmail.com>
+
+    This library is free software; you can redistribute it and/or modify it
+    under the same terms as Perl itself.