Split 'run()' up into 'build()', 'install()', and 'bytecompile()' (for
easier extensibility).
diff --git a/Lib/distutils/command/install_lib.py b/Lib/distutils/command/install_lib.py
index dac644e..b104fa9 100644
--- a/Lib/distutils/command/install_lib.py
+++ b/Lib/distutils/command/install_lib.py
@@ -46,31 +46,46 @@
     def run (self):
 
         # Make sure we have built everything we need first
+        self.build()
+        
+        # Install everything: simply dump the entire contents of the build
+        # directory to the installation directory (that's the beauty of
+        # having a build directory!)
+        outfiles = self.install()
+
+        # (Optionally) compile .py to .pyc
+        self.bytecompile(outfiles)
+
+    # run ()
+
+
+    # -- Top-level worker functions ------------------------------------
+    # (called from 'run()')
+
+    def build (self):
         if not self.skip_build:
             if self.distribution.has_pure_modules():
                 self.run_command('build_py')
             if self.distribution.has_ext_modules():
                 self.run_command('build_ext')
-
-        # Install everything: simply dump the entire contents of the build
-        # directory to the installation directory (that's the beauty of
-        # having a build directory!)
+        
+    def install (self):
         if os.path.isdir(self.build_dir):
             outfiles = self.copy_tree(self.build_dir, self.install_dir)
         else:
             self.warn("'%s' does not exist -- no Python modules to install" %
                       self.build_dir)
             return
+        return outfiles
 
-        # (Optionally) compile .py to .pyc
+    def bytecompile (self, files):
         # XXX hey! we can't control whether we optimize or not; that's up
         # to the invocation of the current Python interpreter (at least
         # according to the py_compile docs).  That sucks.
-
         if self.compile:
             from py_compile import compile
 
-            for f in outfiles:
+            for f in files:
                 # only compile the file if it is actually a .py file
                 if f[-3:] == '.py':
                     out_fn = f + (__debug__ and "c" or "o")
@@ -79,9 +94,10 @@
                     skip_msg = "skipping byte-compilation of %s" % f
                     self.make_file(f, out_fn, compile, (f,),
                                    compile_msg, skip_msg)
-    # run ()
 
 
+    # -- Utility methods -----------------------------------------------
+
     def _mutate_outputs (self, has_any, build_cmd, cmd_option, output_dir):
 
         if not has_any:
@@ -108,6 +124,10 @@
 
         return bytecode_files
         
+
+    # -- External interface --------------------------------------------
+    # (called by outsiders)
+
     def get_outputs (self):
         """Return the list of files that would be installed if this command
         were actually run.  Not affected by the "dry-run" flag or whether