emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/doc/misc ChangeLog Makefile.in ede.texi e...


From: Chong Yidong
Subject: [Emacs-diffs] emacs/doc/misc ChangeLog Makefile.in ede.texi e...
Date: Wed, 07 Oct 2009 01:10:53 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Chong Yidong <cyd>      09/10/07 01:10:53

Modified files:
        doc/misc       : ChangeLog Makefile.in 
Added files:
        doc/misc       : ede.texi eieio.texi 

Log message:
        * eieio.texi:
        * ede.texi: New files.
        
        * Makefile.in: Build EIEIO and EDE manuals.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/doc/misc/ChangeLog?cvsroot=emacs&r1=1.324&r2=1.325
http://cvs.savannah.gnu.org/viewcvs/emacs/doc/misc/Makefile.in?cvsroot=emacs&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/emacs/doc/misc/ede.texi?cvsroot=emacs&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/emacs/doc/misc/eieio.texi?cvsroot=emacs&rev=1.1

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/doc/misc/ChangeLog,v
retrieving revision 1.324
retrieving revision 1.325
diff -u -b -r1.324 -r1.325
--- ChangeLog   5 Oct 2009 11:41:48 -0000       1.324
+++ ChangeLog   7 Oct 2009 01:10:52 -0000       1.325
@@ -1,3 +1,12 @@
+2009-10-07  Chong Yidong  <address@hidden>
+
+       * Makefile.in: Build EIEIO and EDE manuals.
+
+2009-10-07  Eric Ludlam  <address@hidden>
+
+       * eieio.texi:
+       * ede.texi: New files.
+
 2009-10-05  Michael Albinus  <address@hidden>
 
        * tramp.texi (Remote processes): Association of a pty is not supported.

Index: Makefile.in
===================================================================
RCS file: /sources/emacs/emacs/doc/misc/Makefile.in,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- Makefile.in 4 Mar 2009 05:44:22 -0000       1.16
+++ Makefile.in 7 Oct 2009 01:10:53 -0000       1.17
@@ -47,7 +47,9 @@
        $(infodir)/dbus \
        $(infodir)/dired-x \
        $(infodir)/ebrowse \
+       $(infodir)/ede \
        $(infodir)/ediff \
+       $(infodir)/eieio \
        $(infodir)/emacs-mime \
        $(infodir)/epa \
        $(infodir)/erc \
@@ -93,7 +95,9 @@
        dbus.dvi \
        dired-x.dvi \
        ebrowse.dvi \
+       ede.dvi \
        ediff.dvi \
+       eieio.dvi \
        emacs-mime.dvi \
        epa.dvi \
        erc.dvi \
@@ -208,12 +212,24 @@
 ebrowse.dvi: ebrowse.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/ebrowse.texi
 
+ede : $(infodir)/ede
+$(infodir)/ede: ede.texi
+       cd $(srcdir); $(MAKEINFO) ede.texi
+ede.dvi: ede.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/ede.texi
+
 ediff : $(infodir)/ediff
 $(infodir)/ediff: ediff.texi
        cd $(srcdir); $(MAKEINFO) ediff.texi
 ediff.dvi: ediff.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/ediff.texi
 
+eieio : $(infodir)/eieio
+$(infodir)/eieio: eieio.texi
+       cd $(srcdir); $(MAKEINFO) eieio.texi
+eieio.dvi: eieio.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/eieio.texi
+
 emacs-mime : $(infodir)/emacs-mime
 $(infodir)/emacs-mime: emacs-mime.texi
        cd $(srcdir); $(MAKEINFO) --enable-encoding emacs-mime.texi

Index: ede.texi
===================================================================
RCS file: ede.texi
diff -N ede.texi
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ ede.texi    7 Oct 2009 01:10:53 -0000       1.1
@@ -0,0 +1,3797 @@
+\input texinfo
address@hidden ../../info/ede
address@hidden Emacs Development Environment
+
address@hidden
+This file describes EDE, the Emacs Development Environment.
+
+Copyright @copyright{} 1998, 1999, 2000, 2001, 2004, 2005, 2008, 2009
+Free Software Foundation, Inc.
+
address@hidden
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license
+is included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom.''
address@hidden quotation
address@hidden copying
+
address@hidden
address@hidden
+START-INFO-DIR-ENTRY
+* ede: (ede).       Project management for Emacs
+END-INFO-DIR-ENTRY
address@hidden format
address@hidden ifinfo
+
address@hidden
address@hidden @titlefont{EDE (The Emacs Development Environment)}
address@hidden 4
address@hidden by Eric Ludlam
address@hidden titlepage
address@hidden
+
address@hidden cedet{}
address@hidden
address@hidden macro
+
address@hidden semantic{}
address@hidden
address@hidden macro
+
address@hidden srecode{}
address@hidden
address@hidden macro
+
address@hidden eieio{}
address@hidden
address@hidden macro
+
address@hidden ede{}
address@hidden
address@hidden macro
+
address@hidden cogre{}
address@hidden
address@hidden macro
+
address@hidden speedbar{}
address@hidden
address@hidden macro
+
address@hidden
+
address@hidden top, EDE Project Concepts, (dir), (dir)
address@hidden EDE
address@hidden  node-name,  next,  previous,  up
+
address@hidden is the Emacs Development Environment: an Emacs extension that
+simplifies building and debugging programs in Emacs.  It attempts to
+emulate a typical IDE (Integrated Development Environment).  @ede{}
+can manage or create your makefiles and other building environment
+duties, allowing you to concentrate on writing code rather than
+support files.  It aims to make it much easier for new programmers to
+learn and adopt GNU ways of doing things.
+
address@hidden
address@hidden
address@hidden ifnottex
+
address@hidden
+* EDE Project Concepts::        @ede{} Project Concepts
+* EDE Mode::                    Turning on @ede{} mode.
+* Creating a project::          Creating a project.
+* Modifying your project::      Adding and removing files and targets.
+* Building and Debugging::      Initiating a build or debug session.
+* Miscellaneous commands::      Other project related commands.
+* Simple projects::             Projects not managed by @ede{}.
+* Extending EDE::               Programming and extending @ede{}.
address@hidden menu
+
address@hidden EDE Project Concepts, EDE Mode, top, top
address@hidden @ede{} Project Concepts
+
address@hidden is a generic interface for managing projects.  It specifies a
+single set of menus and keybindings, while supporting multiple ways to
+express a project via a build system.
+
+In the subsequent chapters, we will describe the different project
+types (@pxref{Creating a project}), as well as the commands to build
+and debug projects (@pxref{Building and Debugging}).
+
+In @ede{}, a project hierarchy matches a directory hierarchy.  The
+project's topmost directory is called the @dfn{project root}, and its
+subdirectories are @dfn{subprojects}.
+
+Each project can contain multiple @dfn{targets}.  A target, at the
+simplest level, is a named collection of files within a project.  A
+target can specify two different types of information:
+
address@hidden
address@hidden
+A collection of files to be added to a distribution (e.g., a tarball
+that you intend to distribute to others).
+
address@hidden
+A collection of files that can be built into something else (e.g., a
+program or compiled documentation).
address@hidden enumerate
+
+Lastly, @ede{} provides a way for other tools to easily learn file
+associations.  For example, a program might need to restrict some sort
+of search to files in a single target, or to discover the location of
+documentation or interface files.  @ede{} can provide this
+information.
+
address@hidden EDE Mode, Creating a project, EDE Project Concepts, top
address@hidden @ede{} Mode
+
address@hidden is implemented as a minor-mode, which augments other modes such 
as C
+mode, and Texinfo mode.  You can turn @ede{} on for all buffers by running
+the command @code{global-ede-mode}, or by putting this in your
address@hidden/.emacs} file:
+
address@hidden
+(global-ede-mode t)
address@hidden example
+
+When @ede{} is active for a given buffer, the menu item
+``Development'' appears.  This menu provides several menu items for
+high-level @ede{} commands.  These menu items, and their corresponding
+keybindings, are independent of the type of project you are actually
+working on.
+
address@hidden Creating a project, Modifying your project, EDE Mode, top
address@hidden Creating a project
+
+To create a new project, first visit a file that you want to include
+in that project.  If you have a hierarchy of directories, choose a
+file in the topmost directory first.  From this buffer, type @kbd{M-x
+ede-new}, or click on the @samp{Create Project} item in the
address@hidden menu.
+
+The @command{ede-new} command prompts for the type of project you
+would like to create.  Each project type has its own benefits or
+language specific enhancements.  @ede{} supports four different
+project types: @samp{Make}, @samp{Automake}, @samp{direct Automake},
+and @samp{Simple}.
+
address@hidden
address@hidden
+For the @samp{Make} project type, @ede{} creates a @dfn{project file},
+called @file{Project.ede}, in each project directory.  Information
+about the project is stored in this file.  This project autogenerates
+a @file{Makefile}.
+
address@hidden
+For the @samp{Automake} project type, @ede{} creates a
address@hidden project file similar to a @samp{Make} project.
+Unlike a @samp{Make} project, this project autogenerates a
address@hidden file.  @ede{} handles the Automake bootstrapping
+routines, which import and maintain a @file{configure.am} script and
+other required files.
+
address@hidden
+For the @samp{direct Automake} project type, @ede{} reads directly
+from the Automake files.
+
+You cannot create direct Automake projects with the @command{ede-new}
+command.  Instead, when you visit a project with existing Automake
+files, @ede{} automatically detects them.
+
address@hidden
+The @samp{Simple} project type provides light-weight constructs for
+identifying a project root and looking up files.  If you already have
+a address@hidden project infrastructure, you can use a @samp{Simple}
+project to provide other Emacs packages, such as Semantic, with some
+information about the project.  @xref{Simple projects}.
address@hidden itemize
+
+A subproject is merely a project in a subdirectory of another project.
+You can create a subproject by using the @command{ede-new} command (or
+the @samp{Create Project} menu item), while visiting a buffer in a
+subdirectory of the project root.  This new project is automatically
+added to the parent project, and will be automatically loaded when
address@hidden reads the parent project.
+
+When using a project command that involves a makefile, @ede{} uses
+the top-most project's makefile as a starting place for the build.  How
+the toplevel project handles subprojects in the build process is
+dependent on that project's type.
+
address@hidden Modifying your project, Building and Debugging, Creating a 
project, top
address@hidden Modifying your project
+
+In this chapter, we describe the generic features for manipulating
+projects, including the targets and files within them.  Subsequent
+chapters, which describe specific project types, will provide more
+detailed information about exactly what these features do.
+
address@hidden
+* Add/Remove target::
+* Add/Remove files::
+* Customize Features::
+* EDE Project Features::
address@hidden menu
+
address@hidden Add/Remove target, Add/Remove files, Modifying your project, 
Modifying your project
address@hidden Add/Remove target
+
+To create a new target, type @kbd{C-c . t} (@code{M-x ede-new-target})
+or use the @samp{Add Target} menu item in the @samp{Project Options}
+submenu.  This prompts for a target name, and adds the current buffer
+to that target.
+
+The @command{ede-new-target} command also prompts for a @dfn{target
+type}.  Each target type has its own build process and class of files
+that it will accept.
+
+To remove a target from the project, type @kbd{M-x ede-delete-target},
+or use the @samp{Remove Target} menu item in the @samp{Project
+Options} submenu.
+
address@hidden Add/Remove files, Customize Features, Add/Remove target, 
Modifying your project
address@hidden Add/Remove files
+
+To add the current file to an existing target, type @kbd{C-c . a}
+(@code{ede-add-file}), or or use the @samp{Add File} menu item in the
address@hidden Options} submenu.
+
+You can add a file to more than one target; this is OK.
+
+To remove the current file from a target, type @kbd{C-c . d}
+(@code{ede-remove-file}), or or use the @samp{Remove File} menu item
+in the @samp{Target Options} submenu.  If the file belongs to multiple
+targets, this command prompts for each target it could be removed
+from.
+
+While working in a project, if you visit a file that is not part of an
+existing target, @ede{} automatically prompts for a target.  If you do
+not wish to add the file to any target, you can choose @samp{none}.
+You can customize this behavior with the variable
address@hidden
+
address@hidden Customize Features, EDE Project Features, Add/Remove files, 
Modifying your project
address@hidden Customize Features
+
+A project, and its targets, are objects using the @samp{EIEIO} object
+system.  @xref{Top,,,eieio,EIEIO manual}.  These objects have data
+fields containing important information related to your work.
+
+If the high-level functions aren't enough, you can tweak all
+user-customizable fields at any time by running the command
address@hidden or @command{customize-target}.  This loads
+the current project or target into a customization buffer, where you
+can tweak individual slots.  This is usually necessary for complex
+projects.
+
+Some project modes do not have a project file, but directly read a
+Makefile or other existing file.  Instead of directly editing the
+object, you can edit the file by typine @kbd{C-c . e}
+(@code{ede-edit-file-target}).  You should ``rescan'' the project
+afterwards (@pxref{Miscellaneous commands}).
+
address@hidden EDE Project Features,  , Customize Features, Modifying your 
project
address@hidden EDE Project Features
+
+This section details user facing features of an @ede{} @samp{Make}
+style project.  An @samp{Automake} project has similar options (but a
+direct Automake project does not).
+
+To modify any of the specific features mentioned here, you need to
+customize the project or target with @command{customize-project} or
address@hidden
+
+When you are customizing, you are directly manipulating slot values in
address@hidden objects.  @xref{Extending EDE}, if you are interested in
+additional details.
+
address@hidden
+* Changing Compilers and Flags::
+* Configurations::
address@hidden menu
+
address@hidden Changing Compilers and Flags, Configurations, EDE Project 
Features, EDE Project Features
address@hidden Changing Compilers and Flags
+
+Targets that build stuff need compilers.  To change compilers, you
+need to customize the desired target.
+
+In the @samp{[Make]} section, you can choose a new compiler or linker
+from the list.  If a linker you need is not available, you will need
+to create a new one.  @xref{Compiler and Linker objects}.
+
+If an existing compiler or linker is close, but you need to modify
+some flag set such as adding an include path you will need to add a
+configuration variable.
+
+To start, you should create the basic setup, and construct a makefile
+with @command{ede-proj-regenerate}.  Look in the @file{Makefile} to
+see what commands are inserted.  Once you have determined the variable
+you need to modify, you can add a configuration for it.
address@hidden
+
address@hidden Configurations,  , Changing Compilers and Flags, EDE Project 
Features
address@hidden Configurations
+
+Configurations specify different ways to build a project.  For
+example, you may configure a project to be in ``debug'' mode, or
+perhaps in ``release'' mode.
+
+The project, and each target type all have a slot named
address@hidden  To add new variables to a
+configuration find this slot in the custom buffer, and insert a new
+configuration.  Name it either ``debug'' or ``release'', then insert
+some number of name/value pairs to it.
+
+You can have any number of valid configurations too.  To add a new
+configuration, customize your project.  Work in the @samp{[Settings]}
+block for ``configurations''.  Add a new named configuration here.
+
+To switch between different active configurations, modify the
+``configuration default'' slot.
+
address@hidden Building and Debugging, Miscellaneous commands, Modifying your 
project, top
address@hidden Building and Debugging
+
address@hidden provides the following ``project-aware'' compilation and
+debugging commands:
+
address@hidden @kbd
address@hidden C-c . c
+Compile the current target (@code{ede-compile-target}).
address@hidden C-c . C
+Compile the entire project (@code{ede-compile-project}).
address@hidden c-c . D
+Debug the current target (@code{ede-debug-target}).
address@hidden M-x ede-make-dist
+Build a distribution file for your project.
address@hidden table
+
+These commands are also available from the @samp{Development} menu.
+
address@hidden Miscellaneous commands, Simple projects, Building and Debugging, 
top
address@hidden Miscellaneous commands
+
+If you opt to go in and edit @ede{} project files directly---for
+instance, by using @kbd{C-c . e} (@pxref{Customize Features})---you
+must then ``rescan'' the project files to update the internal data
+structures.  To rescan the current project, type @kbd{C-c . g}
+(@code{ede-rescan-toplevel}).
+
address@hidden can help you find files in your project, via the command
address@hidden . f} (@code{ede-find-file}).  This prompts for a file name;
+you need not specify the directory.  EDE then tries to visit a file
+with that name somewhere in your project.
+
address@hidden can use external tools to help with file finding.  To do this,
+customize @code{ede-locate-setup-options}.
+
address@hidden ede-locate-setup-options
address@hidden
+List of locate objects to try out by default.
+Listed in order of preference.  If the first item cannot be used in
+a particular project, then the next one is tried.
+It is always assumed that @dfn{ede-locate-base} is at end of the list.
address@hidden defvar
+
address@hidden also provides a project display mode for the speedbar
+(@pxref{Speedbar,,,emacs,GNU Emacs Manual}).  This allows you to view
+your source files as they are structured in your project: as a
+hierarchical tree, grouped according to target.
+
+To activate the speedbar in this mode, type @kbd{C-c . s}
+(@code{ede-speedbar}).
+
address@hidden Simple projects, Extending EDE, Miscellaneous commands, top
address@hidden Simple Projects
+
+There is a wide array of Simple projects.  The root for simple
+projects is the class @code{ede-simple-project}.  This handles the
+infrastructure of storing a .ede file if needed.
+
+The class @code{ede-simple-project} is designed to be subclassed.
+Then key @ede{} methods can be overridden to provide a quick wrapper
+over any project.
+
+A second project type is @code{ede-cpp-root}.  This project type is
+designed to be created for a directory hierarchy full of C/C++ code.
+It can be configured with minimal lisp knowledge to do header file
+lookup for @semantic{}, improving code completion performance.
+
address@hidden
+* ede-cpp-root::        This project marks the root of a C/C++ code project.
+* ede-simple subclassing:: Create your own simple project.
+* ede-emacs::          A project for working with Emacs.
+* ede-linux::          A project for working with Linux kernels.
+* Custom Locate::       Customizing how to locate files in a simple project
address@hidden menu
+
address@hidden ede-cpp-root
address@hidden ede-cpp-root
+
+The @code{ede-cpp-root} project type allows you to create a single
+object with no save-file in your @file{.emacs} file.  It allows @ede{}
+to provide the @semantic{} package with the ability to find header
+files quickly.
+
+The @code{ede-cpp-root} class knows a few things about C++ projects,
+such as the prevalence of "include" directories, and typical
+file-layout stuff.  If this isn't sufficient, you can subclass
address@hidden and add your own tweaks in just a few
+lines.  See the end of this file for an example.
+
+In the most basic case, add this to your @file{.emacs} file, modifying
+appropriate bits as needed.
+
address@hidden
+(ede-cpp-root-project "SOMENAME" :file "/dir/to/some/file")
address@hidden example
+
+Replace @var{SOMENAME} with whatever name you want, and the filename
+to an actual file at the root of your project.  It might be a
+Makefile, a README file.  Whatever.  It doesn't matter.  It's just a
+key to hang the rest of @ede{} off of.
+
+The most likely reason to create this project, is to speed up
+searching for includes files, or to simplify bootstrapping @semantic{}'s
+ability to find files without much user interaction.  In conjunction
+with @semantic{} completion, having a short include path is key.  You can
+override the default include path and system include path like this:
+
address@hidden
+(ede-cpp-root-project "NAME" :file "FILENAME"
+    :include-path '( "/include" "../include" "/c/include" )
+    :system-include-path '( "/usr/include/c++/3.2.2/" )
+    :spp-table '( ("MOOSE" . "")
+                  ("CONST" . "const") ) )
address@hidden example
+
+ In this case each item in the include path list is searched.  If the
+directory starts with "/", then that expands to the project root
+directory.  If a directory does not start with "/", then it is
+relative to the default-directory of the current buffer when the file
+name is expanded.
+
+ The include path only affects C/C++ header files.  Use the slot
address@hidden:header-match-regexp} to change it.
+
+The @code{:system-include-path} allows you to specify full directory
+names to include directories where system header files can be found.
+These will be applied to files in this project only.
+
+The @code{:spp-table} provides a list of project specific #define
+style macros that are unique to this project, passed in to the
+compiler on the command line, or are in special headers.
+See the @code{semantic-lex-c-preprocessor-symbol-map} for more
+on how to format this entry.
+
+If there is a single file in your project, you can instead set the
address@hidden:spp-files} to a list of file names relative to the root of your
+project.  Specifying this is like setting the variable
address@hidden in semantic.
+
+If you want to override the file-finding tool with your own
+function you can do this:
+
address@hidden
+(ede-cpp-root-project "NAME" :file "FILENAME" :locate-fcn 'MYFCN)
address@hidden example
+
+Where @var{MYFCN} is a symbol for a function.  The locate function can
+be used in place of @code{ede-expand-filename} so you can quickly
+customize your custom target to use specialized local routines instead
+of the default @ede{} routines.  The function symbol must take two
+arguments:
+
address@hidden @var
address@hidden NAME
+The name of the file to find.
address@hidden DIR
+The directory root for this cpp-root project.
address@hidden table
+
+
+If the cpp-root project style is right for you, but you want a dynamic
+loader, instead of hard-coding path name values in your @file{.emacs}, you
+can do that too, but you will need to write some lisp code.
+
+To do that, you need to add an entry to the
address@hidden list, and also provide two functions to
+teach @ede{} how to load your project pattern
+
+It would look like this:
+
address@hidden
+(defun MY-FILE-FOR-DIR (&optional dir)
+  "Return a full file name to the project file stored in DIR."
+  <write your code here, or return nil>
+  )
+
+(defun MY-ROOT-FCN ()
+  "Return the root fcn for `default-directory'"
+  ;; You might be able to use `ede-cpp-root-project-root'
+  ;; and not write this at all.
+  )
+
+(defun MY-LOAD (dir)
+  "Load a project of type `cpp-root' for the directory DIR.
+Return nil if there isn't one."
+  ;; Use your preferred constructin method here.
+  (ede-cpp-root-project "NAME" :file (expand-file-name "FILE" dir)
+                               :locate-fcn 'MYFCN)
+  )
+
+(add-to-list 'ede-project-class-files
+            (ede-project-autoload "cpp-root"
+             :name "CPP ROOT"
+             :file 'ede-cpp-root
+             :proj-file 'MY-FILE-FOR-DIR
+              :proj-root 'MY-ROOT-FCN
+             :load-type 'MY-LOAD
+             :class-sym 'ede-cpp-root)
+            t)
address@hidden example
+
+This example only creates an auto-loader, and does not create a new kind
+of project.
+
address@hidden, for details about the class that defines
+the @code{ede-cpp-root} project type.
+
address@hidden ede-simple subclassing
address@hidden ede-simple Subclassing
+
+todo - Write some doc.
+
+  In the meantime look in the commentary of ede-simple.el
+
address@hidden ede-emacs
address@hidden ede-emacs
+
+The @code{ede-emacs} project automatically identifies an Emacs source
+tree, and enables EDE project mode for it.
+
+It pre-populates the C Preprocessor symbol map for correct parsing,
+and has an optimized include file identification function.
+
address@hidden ede-linux
address@hidden ede-linux
+
+The @code{ede-linux} project will automatically identify a Linux
+Kernel source tree, and enable EDE project mode for it.
+
+It pre-populates the C Preprocessor symbol map for reasonable parsing,
+and has an optimized include file identification function.
+
address@hidden Custom Locate
address@hidden Custom Locate
+
+The various simple project styles all have one major drawback, which
+is that the files in the project are not completely known to EDE.
+When the EDE API is used to try and file files by some reference name
+in the project, then that could fail.
+
+@@TODO - Add ID Utils and CScope examples
+
address@hidden can therefore use some external locate commands, such as the unix
+``locate'' command, or ``GNU Global''.
+
+Configuration of the tool you want to use such as @code{locate}, or
address@hidden will need to be done without the aid of @ede{}.  Once
+configured, however, @ede{} can use it.
+
+To enable one of these tools, set the variable
address@hidden with the names of different locate
+objects.  @ref{Miscellaneous commands}.
+
+Configure this in your @file{.emacs} before loading in CEDET or EDE.
+If you want to add support for GNU Global, your configuration would
+look like this:
+
address@hidden
+(setq ede-locate-setup-options '(ede-locate-global ede-locate-base))
address@hidden example
+
+That way, when a search needs to be done, it will first try using
+GLOBAL.  If global is not available for that directory, then it will
+revert to the base locate object.  The base object always fails to
+find a file.
+
+You can add your own locate tool but subclassing from
address@hidden  The subclass should also implement two
+methods.  See the code in @file{ede-locate.el} for GNU Global as a
+simple example.
+
address@hidden Extending EDE, , Simple projects, top
address@hidden Extending @ede{}
+
+This chapter is intended for users who want to write new parts or fix
+bugs in @ede{}.  A knowledge of Emacs Lisp, and some @eieio{}(CLOS) is
+required.
+
address@hidden uses @eieio{}, the CLOS package for Emacs, to define two object
+superclasses, specifically the PROJECT and TARGET.  All commands in
address@hidden are usually meant to address the current project, or current
+target.
+
+All specific projects in @ede{} derive subclasses of the @ede{}
+superclasses.  In this way, specific behaviors such as how a project
+is saved, or how a target is compiled can be customized by a project
+author in detail.  @ede{} communicates to these project objects via an
+API using methods.  The commands you use in @ede{} mode are high-level
+functional wrappers over these methods.  @xref{(eieio)Top}. For
+details on using @eieio{} to extending classes, and writing methods.
+
+If you intend to extend @ede{}, it is most likely that a new target type is
+needed in one of the existing project types.  The rest of this chapter
+will discuss extending the @code{ede-project} class, and it's targets.
+See @file{project-am.el} for basic details on adding targets to it.
+
+For the @code{ede-project} type, the core target class is called
address@hidden  Inheriting from this will give you everything
+you need to start, including adding your sources into the makefile.  If
+you also need additional rules in the makefile, you will want to inherit
+from @code{ede-proj-target-makefile} instead.  You may want to also add
+new fields to track important information.
+
+If you are building currently unsupported code into a program or shared
+library, it is unlikely you need a new target at all.  Instead you
+would need to create a new compiler or linker object that compiles
+source code of the desired type. @ref{Compiler and Linker objects}.
+
+Once your new class exists, you will want to fill in some basic methods.
+See the @file{ede-skel.el} file for examples of these.  The files
address@hidden and @file{ede-proj-elisp.el} are two interesting
+examples.
+
address@hidden
+* User interface methods::      Methods associated with keybindings
+* Base project methods::        The most basic methods on @ede{} objects.
+* Sourcecode objects::          Defining new sourcecode classes.
+* Compiler and Linker objects::  Defining new compilers and linkers.
+* Project::                     Details of project classes.
+* Targets::                     Details of target classes.
+* Sourcecode::                  Details of source code classes.
+* Compilers::                   Details of compiler classes.
address@hidden menu
+
address@hidden User interface methods
address@hidden User interface methods
+
+These methods are core behaviors associated with user commands.
+If you do not implement a method, there is a reasonable default that
+may do what you need.
+
address@hidden @code
address@hidden project-add-file
+Add a file to your project.  Override this if you want to put new
+sources into different fields depending on extension, or other details.
address@hidden project-remove-file
+Reverse of project-add-file.
address@hidden project-compile-target
+Override this if you want to do something special when the user
+"compiles" this target.
address@hidden project-debug-target
+What to do when a user wants to debug your target.
address@hidden project-update-version
+Easily update the version number of your project.
address@hidden project-edit-file-target
+Edit the file the project's information is stored in.
address@hidden project-new-target
+Create a new target in a project.
address@hidden project-delete-target
+Delete a target from a project.
address@hidden project-make-dist
+Make a distribution (tar archive) of the project.
address@hidden project-rescan
+Rescan a project file, changing the data in the existing objects.
address@hidden table
+
address@hidden Base project methods
address@hidden Base project methods
+
+These methods are important for querying base information from project
+and target types:
+
address@hidden @code
address@hidden ede-name
+Return a string that is the name of this target.
address@hidden ede-target-name
+Return a string that is the name of the target used by a Make system.
address@hidden ede-description
+A brief description of the project or target.  This is currently used
+by the @samp{ede-speedbar} interface.
address@hidden ede-want-file-p
+Return non-nil if a target will accept a given file.
+It is generally unecessary to override this.  See the section on source
+code.
address@hidden ede-buffer-mine
+Return non-nil if a buffer belongs to this target.  Used during
+association when a file is loaded.  It is generally unecessary to
+override this unless you keep auxiliary files.
address@hidden table
+
+These methods are used by the semantic package extensions @xref{(semantic)Top}.
+
address@hidden @code
address@hidden ede-buffer-header-file
+Return a header file belonging to a given buffer.  Prototypes are place
+there when appropriate
address@hidden ede-buffer-documentation-files
+Return the documentation file information about this file would be
+stored in.
address@hidden ede-documentation
+List all documentation a project or target is responsible for.
address@hidden table
+
address@hidden Sourcecode objects
address@hidden Sourcecode objects
+
address@hidden projects track source file / target associates via source code
+objects.  The definitions for this is in @file{ede-source.el}.  A source
+code object contains methods that know how to identify a file as being
+of that class, (ie, a C file ends with @file{.c}).  Some targets can
+handle many different types of sources which must all be compiled
+together.  For example, a mixed C and C++ program would have
+instantiations of both sourcecode types.
+
+When a target needs to know if it will accept a source file, it
+references its list of source code objects.  These objects then make
+that decision.
+
+Source code objects are stored in the target objects as a list of
+symbols, where the symbol's value is the object.  This enables the
+project save file mechanism to work.
+
+Here is an example for an instantiation of an Emacs Lisp source code object:
+
address@hidden
+(defvar ede-source-emacs
+  (ede-sourcecode "ede-emacs-source"
+                 :name "Emacs Lisp"
+                 :sourcepattern "\\.el$"
+                 :garbagepattern '("*.elc"))
+  "Emacs Lisp source code definition.")
address@hidden example
+
+If you want to recycle parts of an existing sourcecode object, you can
+clone the original, and then just tweak the parts that are different.
+For example:
+
address@hidden
+(defvar ede-source-emacs-autoload
+  (clone ede-source-emacs "ede-source-emacs-autoload"
+         :name "Emacs Lisp Autoload"
+         :sourcepattern "-loaddefs\\.el")
+  "Emacs Lisp autoload source code.")
address@hidden example
+
+In this case, the garbage pattern is the same.
+
address@hidden
+
address@hidden Compiler and Linker objects
address@hidden Compiler and Linker objects
+
+In order for a target to create a @file{Makefile}, it must know how to
+compile the sources into the program or desired data file, and
+possibly link them together.
+
+A compiler object instantiation is used to associate a given target
+with a given source code type.  Some targets can handle many types of
+sources, and thus has many compilers available to it.  Some targets
+may have multiple compilers for a given type of source code.
+
address@hidden will examine the actual source files in a target, cross reference
+that against the compiler list to come up with the final set of
+compilers that will be inserted into the Makefile.
+
+Compiler instantiations must also insert variables specifying the
+compiler it plans to use, in addition to creating Automake settings for
address@hidden when appropriate.
+
+Compiler objects are stored in the target objects as a list of
+symbols, where the symbols value is the object.  This enables the
+project output mechanism to work more efficiently.
+
+Targets will also have a special "compiler" slot which lets a user
+explicitly choose the compiler they want to use.
+
+Here is an example for texinfo:
+
address@hidden
+(defvar ede-makeinfo-compiler
+  (ede-compiler
+   "ede-makeinfo-compiler"
+   :name "makeinfo"
+   :variables '(("MAKEINFO" . "makeinfo"))
+   :commands '("makeinfo -o $@ $<")
+   :autoconf '(("AC_CHECK_PROG" . "MAKEINFO, makeinfo"))
+   :sourcetype '(ede-makeinfo-source)
+   )
+  "Compile texinfo files into info files.")
address@hidden example
+
address@hidden
+
+When creating compiler instantiations, it may be useful to @code{clone}
+an existing compiler variable.  Cloning allows you to only modify
+parts of the original, while keeping the rest of the same.
+Modification of the original will result in the clone also being
+changed for shared value slots.
+
+The second important object is the linker class.  The linker is similar
+to the compiler, except several compilers might be used to create some
+object files, and only one linker is used to link those objects together.
+
+See @file{ede-proj-obj.el} for examples of the combination.
+
address@hidden pj
address@hidden tg
address@hidden sc
address@hidden cm
+
address@hidden Project
address@hidden Project
+
address@hidden
+* ede-project-placeholder ::
+*  ede-project ::
+*   ede-cpp-root-project ::
+*   ede-simple-project ::
+*   ede-simple-base-project ::
+*   ede-proj-project ::
+*   project-am-makefile ::
+*   ede-step-project ::
address@hidden menu
+
address@hidden ede-project-placeholder
address@hidden ede-project-placeholder
address@hidden ede-project-placeholder
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden ede-project-placeholder
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-project}.}
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :name
+Type: @code{string} @*
+Default Value: @code{"Untitled"}
+
+The name used when generating distribution files.
address@hidden
+
address@hidden :version
+Type: @code{string} @*
+Default Value: @code{"1.0"}
+
+The version number used when distributing files.
address@hidden
+
address@hidden :directory
+Type: @code{string}
+
+Directory this project is associated with.
address@hidden
+
address@hidden :file
+Type: @code{string}
+
+File name where this project is stored.
address@hidden
+
address@hidden table
+
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method ede--project-inode :AFTER proj
+Get the inode of the directory project @var{PROJ} is in.
address@hidden deffn
+
address@hidden Method ede-project-root :AFTER this
+If a project knows it's root, return it here.
+Allows for one-project-object-for-a-tree type systems.
address@hidden deffn
+
address@hidden Method ede-find-subproject-for-directory :AFTER proj dir
+Find a subproject of @var{PROJ} that corresponds to @var{DIR}.
address@hidden deffn
+
address@hidden Method ede-project-root-directory :AFTER this &optional file
+If a project knows it's root, return it here.
+Allows for one-project-object-for-a-tree type systems.
+Optional @var{FILE} is the file to test.  It is ignored in preference
+of the anchor file for the project.
address@hidden deffn
+
address@hidden Method ede-project-force-load :AFTER this
+Make sure the placeholder @var{THIS} is replaced with the real thing.
+Return the new object created in its place.
address@hidden deffn
+
address@hidden Method project-interactive-select-target :AFTER this prompt
+Make sure placeholder @var{THIS} is replaced with the real thing, and pass 
through.
address@hidden deffn
+
address@hidden Method project-add-file :AFTER this file
+Make sure placeholder @var{THIS} is replaced with the real thing, and pass 
through.
address@hidden deffn
+
address@hidden ede-project
address@hidden ede-project
address@hidden ede-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-project
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-cpp-root-project},} @w{ede-emacs-project,} 
@w{ede-linux-project,} @w{ede-maven-project,} @address@hidden,} 
@address@hidden,} @address@hidden,} @address@hidden,} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :targets
+Type: @code{list}
+
+List of top level targets in this project.
address@hidden
+
address@hidden :tool-cache
+Type: @code{list}
+
+List of tool cache configurations in this project.
+This allows any tool to create, manage, and persist project-specific settings.
address@hidden
+
address@hidden :web-site-url
+Type: @code{string} @*
+
+URL to this projects web site.
+This is a URL to be sent to a web site for documentation.
address@hidden
+
address@hidden :web-site-directory @*
+
+A directory where web pages can be found by Emacs.
+For remote locations use a path compatible with ange-ftp or EFS.
+You can also use TRAMP for use with rcp & scp.
address@hidden
+
address@hidden :web-site-file @*
+
+A file which contains the home page for this project.
+This file can be relative to slot @code{web-site-directory}.
+This can be a local file, use ange-ftp, EFS, or TRAMP.
address@hidden
+
address@hidden :ftp-site
+Type: @code{string} @*
+
+FTP site where this project's distribution can be found.
+This FTP site should be in Emacs form, as needed by @code{ange-ftp}, but can
+also be of a form used by TRAMP for use with scp, or rcp.
address@hidden
+
address@hidden :ftp-upload-site
+Type: @code{string} @*
+
+FTP Site to upload new distributions to.
+This FTP site should be in Emacs form as needed by @code{ange-ftp}.
+If this slot is @code{nil}, then use @code{ftp-site} instead.
address@hidden
+
address@hidden :configurations
+Type: @code{list} @*
+Default Value: @code{("debug" "release")}
+
+List of available configuration types.
+Individual target/project types can form associations between a configuration,
+and target specific elements such as build variables.
address@hidden
+
address@hidden :configuration-default @*
+Default Value: @code{"debug"}
+
+The default configuration.
address@hidden
+
address@hidden :local-variables @*
+Default Value: @code{nil}
+
+Project local variables
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-preprocessor-map :AFTER this
+Get the pre-processor map for project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-subproject-relative-path :AFTER proj &optional 
parent-in
+Get a path name for @var{PROJ} which is relative to the parent project.
+If PARENT is specified, then be relative to the PARENT project.
+Specifying PARENT is useful for sub-sub projects relative to the root project.
address@hidden deffn
+
address@hidden Method eieio-speedbar-description :AFTER obj
+Provide a speedbar description for @var{OBJ}.
address@hidden deffn
+
address@hidden Method ede-map-any-target-p :AFTER this proc
+For project @var{THIS}, map @var{PROC} to all targets and return if any 
non-nil.
+Return the first address@hidden value returned by @var{PROC}.
address@hidden deffn
+
address@hidden Method ede-map-subprojects :AFTER this proc
+For object @var{THIS}, execute @var{PROC} on all direct subprojects.
+This function does not apply @var{PROC} to sub-sub projects.
+See also @dfn{ede-map-all-subprojects}.
address@hidden deffn
+
address@hidden Method ede-convert-path :AFTER this path
+Convert path in a standard way for a given project.
+Default to making it project relative.
+Argument @var{THIS} is the project to convert @var{PATH} to.
address@hidden deffn
+
address@hidden Method ede-name :AFTER this
+Return a short-name for @var{THIS} project file.
+Do this by extracting the lowest directory name.
address@hidden deffn
+
address@hidden Method ede-set-project-variables :AFTER project &optional buffer
+Set variables local to @var{PROJECT} in @var{BUFFER}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-derive-line-path :AFTER obj &optional depth
+Return the path to @var{OBJ}.
+Optional @var{DEPTH} is the depth we start at.
address@hidden deffn
+
address@hidden Method ede-map-all-subprojects :AFTER this allproc
+For object @var{THIS}, execute PROC on @var{THIS} and  all subprojects.
+This function also applies PROC to sub-sub projects.
+See also @dfn{ede-map-subprojects}.
address@hidden deffn
+
address@hidden Method project-update-version :AFTER ot
+The @code{:version} of the project @var{OT} has been updated.
+Handle saving, or other detail.
address@hidden deffn
+
address@hidden Method ede-buffer-header-file :AFTER this buffer
+Return @code{nil}, projects don't have header files.
address@hidden deffn
+
address@hidden Method ede-buffer-documentation-files :AFTER this buffer
+Return all documentation in project @var{THIS} based on @var{BUFFER}.
address@hidden deffn
+
address@hidden Method ede-map-targets :AFTER this proc
+For object @var{THIS}, execute @var{PROC} on all targets.
address@hidden deffn
+
address@hidden Method ede-buffer-mine :AFTER this buffer
+Return address@hidden if object @var{THIS} lays claim to the file in 
@var{BUFFER}.
address@hidden deffn
+
address@hidden Method ede-object-keybindings :BEFORE this
+Retrieves the slot @code{keybindings} from an object of class 
@code{ede-project}
address@hidden deffn
+
address@hidden Method ede-description :AFTER this
+Return a description suitable for the minibuffer about @var{THIS}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-object-children :AFTER this
+Return the list of speedbar display children for @var{THIS}.
address@hidden deffn
+
address@hidden Method project-make-dist :AFTER this
+Build a distribution for the project based on @var{THIS} project.
address@hidden deffn
+
address@hidden Method ede-system-include-path :AFTER this
+Get the system include path used by project @var{THIS}.
address@hidden deffn
+
address@hidden Method project-new-target-custom :AFTER proj
+Create a new target.  It is up to the project @var{PROJ} to get the name.
address@hidden deffn
+
address@hidden Method ede-subproject-p :AFTER proj
+Return address@hidden if @var{PROJ} is a sub project.
address@hidden deffn
+
address@hidden Method ede-expand-filename :AFTER this filename &optional force
+Return a fully qualified file name based on project @var{THIS}.
address@hidden should be just a filename which occurs in a directory controlled
+by this project.
+Optional argument @var{FORCE} forces the default filename to be provided even 
if it
+doesn't exist.
address@hidden deffn
+
address@hidden Method ede-menu-items-build :AFTER obj &optional current
+Return a list of menu items for building project @var{OBJ}.
+If optional argument @var{CURRENT} is address@hidden, return sub-menu code.
address@hidden deffn
+
address@hidden Method ede-update-version-in-source :AFTER this version
+Change occurrences of a version string in sources.
+In project @var{THIS}, cycle over all targets to give them a chance to set
+their sources to @var{VERSION}.
address@hidden deffn
+
address@hidden Method project-new-target :AFTER proj &rest args
+Create a new target.  It is up to the project @var{PROJ} to get the name.
address@hidden deffn
+
address@hidden Method project-compile-project :AFTER obj &optional command
+Compile the entire current project @var{OBJ}.
+Argument @var{COMMAND} is the command to use when compiling.
address@hidden deffn
+
address@hidden Method eieio-speedbar-object-buttonname :AFTER object
+Return a string to use as a speedbar button for @var{OBJECT}.
address@hidden deffn
+
address@hidden Method ede-map-project-buffers :AFTER this proc
+For @var{THIS}, execute @var{PROC} on all buffers belonging to @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-expand-filename-impl :AFTER this filename &optional 
force
+Return a fully qualified file name based on project @var{THIS}.
address@hidden should be just a filename which occurs in a directory controlled
+by this project.
+Optional argument @var{FORCE} forces the default filename to be provided even 
if it
+doesn't exist.
address@hidden deffn
+
address@hidden Method eieio-done-customizing :AFTER proj
+Call this when a user finishes customizing @var{PROJ}.
address@hidden deffn
+
address@hidden Method ede-html-documentation :AFTER this
+Return a list of HTML files provided by project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-documentation :AFTER this
+Return a list of files that provides documentation.
+Documentation is not for object @var{THIS}, but is provided by @var{THIS} for 
other
+files in the project.
address@hidden deffn
+
address@hidden Method project-interactive-select-target :AFTER this prompt
+Interactively query for a target that exists in project @var{THIS}.
+Argument @var{PROMPT} is the prompt to use when querying the user for a target.
address@hidden deffn
+
address@hidden Method ede-target-in-project-p :AFTER proj target
+Is @var{PROJ} the parent of @var{TARGET}?
+If @var{TARGET} belongs to a subproject, return that project file.
address@hidden deffn
+
address@hidden Method ede-find-target :AFTER proj buffer
+Fetch the target in @var{PROJ} belonging to @var{BUFFER} or nil.
address@hidden deffn
+
address@hidden Method ede-add-subproject :AFTER proj-a proj-b
+Add into @var{PROJ-A}, the subproject @var{PROJ-B}.
address@hidden deffn
+
address@hidden Method ede-commit-project :AFTER proj
+Commit any change to @var{PROJ} to its file.
address@hidden deffn
+
address@hidden Method project-dist-files :AFTER this
+Return a list of files that constitutes a distribution of @var{THIS} project.
address@hidden deffn
+
address@hidden Method ede-object-menu :BEFORE this
+Retrieves the slot @code{menu} from an object of class @code{ede-project}
address@hidden deffn
+
address@hidden Method ede-commit-local-variables :AFTER proj
+Commit change to local variables in @var{PROJ}.
address@hidden deffn
+
address@hidden ede-cpp-root-project
address@hidden ede-cpp-root-project
address@hidden ede-cpp-root-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-cpp-root-project
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
+This class implements the @code{ede-cpp-root} project type.
address@hidden, for information about using this project type.
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :include-path
+Type: @code{list} @*
+Default Value: @code{(quote ("/include" "../include/"))}
+
+The default locate function expands filenames within a project.
+If a header file (.h, .hh, etc) name is expanded, and
+the @code{:locate-fcn} slot is @code{nil}, then the include path is checked
+first, and other directories are ignored.  For very large
+projects, this optimization can save a lot of time.
+
+Directory names in the path can be relative to the current
+buffer's @code{default-directory} (not starting with a /).  Directories
+that are relative to the project's root should start with a /, such
+as  "/include", meaning the directory @code{include} off the project root
+directory.
address@hidden
+
address@hidden :system-include-path
+Type: @code{list} @*
+Default Value: @code{nil}
+
+The system include path for files in this project.
+C files initialized in an ede-cpp-root-project have their semantic
+system include path set to this value.  If this is @code{nil}, then the
+semantic path is not modified.
address@hidden
+
address@hidden :spp-table
+Type: @code{list} @*
+Default Value: @code{nil}
+
+C Preprocessor macros for your files.
+Preprocessor symbols will be used while parsing your files.
+These macros might be passed in through the command line compiler, or
+are critical symbols derived from header files.  Providing header files
+macro values through this slot improves accuracy and performance.
+Use `:spp-files' to use these files directly.
address@hidden
+
address@hidden :spp-files
+Type: @code{list} @*
+Default Value: @code{nil}
+
+C header file with Preprocessor macros for your files.
+The PreProcessor symbols appearing in these files will be used while
+parsing files in this project.
+See @code{semantic-lex-c-preprocessor-symbol-map} for more on how this works.
address@hidden
+
address@hidden :header-match-regexp
+Type: @code{string} @*
+Default Value: @code{"\\.\\(h\\(h\\|xx\\|pp\\|\\+\\+\\)?\\|H\\)$\\|\\<\\w+$"}
+
+Regexp used to identify C/C++ header files.
address@hidden
+
address@hidden :locate-fcn
+Type: @code{(or null function)} @*
+Default Value: @code{nil}
+
+The locate function can be used in place of
address@hidden so you can quickly customize your custom target
+to use specialized local routines instead of the EDE routines.
+The function symbol must take two arguments:
+  NAME - The name of the file to find.
+  DIR - The directory root for this cpp-root project.
+
+It should return the fully qualified file name passed in from NAME.  If that 
file does not
+exist, it should return nil.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method initialize-instance :AFTER this &rest fields
+Make sure the @code{:file} is fully expanded.
address@hidden deffn
+
address@hidden Method ede-preprocessor-map :AFTER this
+Get the pre-processor map for project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-cpp-root-header-file-p :AFTER proj name
+Non @code{nil} if in @var{PROJ} the filename @var{NAME} is a header.
address@hidden deffn
+
address@hidden Method ede-system-include-path :AFTER this
+Get the system include path used by project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-expand-filename-impl :AFTER proj name
+Within this project @var{PROJ}, find the file @var{NAME}.
+This knows details about or source tree.
address@hidden deffn
+
address@hidden ede-simple-project
address@hidden ede-simple-project
address@hidden ede-simple-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-simple-project
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method ede-commit-project :AFTER proj
+Commit any change to @var{PROJ} to its file.
address@hidden deffn
+
address@hidden ede-simple-base-project
address@hidden ede-simple-base-project
address@hidden ede-simple-base-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-simple-base-project
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
+  EDE Simple project base class.
+This one project could control a tree of subdirectories.
+
address@hidden @asis
address@hidden table
+
address@hidden ede-proj-project
address@hidden ede-proj-project
address@hidden ede-proj-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-project
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :makefile-type
+Type: @code{symbol} @*
+Default Value: @code{Makefile}
+
+The type of Makefile to generate.
+Can be one of @code{'Makefile}, 'Makefile.in, or 'Makefile.am.
+If this value is NOT @code{'Makefile}, then that overrides the 
@code{:makefile} slot
+in targets.
address@hidden
+
address@hidden :variables
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Variables to set in this Makefile.
address@hidden
+
address@hidden :configuration-variables
+Type: @code{list} @*
+Default Value: @code{("debug" (("DEBUG" . "1")))}
+
+Makefile variables to use in different configurations.
+These variables are used in the makefile when a configuration becomes active.
address@hidden
+
address@hidden :inference-rules @*
+Default Value: @code{nil}
+
+Inference rules to add to the makefile.
address@hidden
+
address@hidden :include-file @*
+Default Value: @code{nil}
+
+Additional files to include.
+These files can contain additional rules, variables, and customizations.
address@hidden
+
address@hidden :automatic-dependencies
+Type: @code{boolean} @*
+Default Value: @code{t}
+
address@hidden to do implement automatic dependencies in the Makefile.
address@hidden
+
address@hidden :metasubproject
+Type: @code{boolean} @*
+Default Value: @code{nil}
+
address@hidden if this is a metasubproject.
+Usually, a subproject is determined by a parent project.  If multiple top level
+projects are grouped into a large project not maintained by EDE, then you need
+to set this to non-nil.  The only effect is that the @code{dist} rule will 
then avoid
+making a tar file.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-create :AFTER this mfilename
+Create a Makefile for all Makefile targets in @var{THIS}.
address@hidden is the makefile to generate.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-tags :AFTER this targets
+Insert into the current location rules to make recursive TAGS files.
+Argument @var{THIS} is the project to create tags for.
+Argument @var{TARGETS} are the targets we should depend on for TAGS.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this
+Insert variables needed by target @var{THIS}.
address@hidden deffn
+
address@hidden Method project-make-dist :AFTER this
+Build a distribution for the project based on @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-rules :AFTER this
+Insert distribution rules for @var{THIS} in a Makefile, such as CLEAN and DIST.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-dependencies :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Argument @var{THIS} is the project that should insert stuff.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-subproj-rules :AFTER this
+Insert a rule for the project @var{THIS} which should be a subproject.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-create-maybe :AFTER this mfilename
+Create a Makefile for all Makefile targets in @var{THIS} if needed.
address@hidden is the makefile to generate.
address@hidden deffn
+
address@hidden Method ede-proj-configure-test-required-file :AFTER this file
+For project @var{THIS}, test that the file @var{FILE} exists, or create it.
address@hidden deffn
+
address@hidden Method ede-proj-setup-buildenvironment :AFTER this &optional 
force
+Setup the build environment for project @var{THIS}.
+Handles the Makefile, or a Makefile.am configure.in combination.
+Optional argument @var{FORCE} will force items to be regenerated.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-garbage-patterns :AFTER this
+Return a list of patterns that are considered garbage to @var{THIS}.
+These are removed with make clean.
address@hidden deffn
+
address@hidden Method ede-proj-configure-synchronize :AFTER this
+Synchronize what we know about project @var{THIS} into configure.in.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables-new :AFTER this
+Insert variables needed by target @var{THIS}.
+
+NOTE: Not yet in use!  This is part of an SRecode conversion of
+      EDE that is in progress.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-configuration-variables :AFTER this 
configuration
+Return a list of configuration variables from @var{THIS}.
+Use @var{CONFIGURATION} as the current configuration to query.
address@hidden deffn
+
address@hidden Method eieio-done-customizing :AFTER proj
+Call this when a user finishes customizing this object.
+Argument @var{PROJ} is the project to save.
address@hidden deffn
+
address@hidden Method ede-proj-configure-recreate :AFTER this
+Delete project @var{THIS}es configure script and start over.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-user-rules :AFTER this
+Insert user specified rules needed by @var{THIS} target.
+This is different from @dfn{ede-proj-makefile-insert-rules} in that this
+function won't create the building rules which are auto created with
+automake.
address@hidden deffn
+
address@hidden Method ede-proj-dist-makefile :AFTER this
+Return the name of the Makefile with the DIST target in it for @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-configure-file :AFTER this
+The configure.in script used by project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-commit-project :AFTER proj
+Commit any change to @var{PROJ} to its file.
address@hidden deffn
+
address@hidden Method project-dist-files :AFTER this
+Return a list of files that constitutes a distribution of @var{THIS} project.
address@hidden deffn
+
address@hidden Method ede-commit-local-variables :AFTER proj
+Commit change to local variables in @var{PROJ}.
address@hidden deffn
+
address@hidden project-am-makefile
address@hidden project-am-makefile
address@hidden project-am-makefile
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-makefile
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-subtree :AFTER ampf subdir
+Return the sub project in @var{AMPF} specified by @var{SUBDIR}.
address@hidden deffn
+
address@hidden Method project-targets-for-file :AFTER proj
+Return a list of targets the project @var{PROJ}.
address@hidden deffn
+
address@hidden Method project-new-target :AFTER proj &optional name type
+Create a new target named @var{NAME}.
+Argument @var{TYPE} is the type of target to insert.  This is a string
+matching something in @code{project-am-type-alist} or type class symbol.
+Despite the fact that this is a method, it depends on the current
+buffer being in order to provide a smart default target type.
address@hidden deffn
+
address@hidden ede-step-project
address@hidden ede-step-project
address@hidden ede-step-project
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-step-project
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :init-variables
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Variables to set in this Makefile, at top of file.
address@hidden
+
address@hidden :additional-variables
+Type: @code{(or null list)} @*
+Default Value: @code{nil}
+
+Arbitrary variables needed from this project.
+It is safe to leave this blank.
address@hidden
+
address@hidden :additional-rules
+Type: @code{(or null list)} @*
+Default Value: @code{nil}
+
+Arbitrary rules and dependencies needed to make this target.
+It is safe to leave this blank.
address@hidden
+
address@hidden :installation-domain
+Type: @code{symbol} @*
+Default Value: @code{user}
+
+Installation domain specification.
+The variable GNUSTEP_INSTALLATION_DOMAIN is set at this value.
address@hidden
+
address@hidden :preamble
+Type: @code{(or null list)} @*
+Default Value: @code{(quote ("GNUmakefile.preamble"))}
+
+The auxilliary makefile for additional variables.
+Included just before the specific target files.
address@hidden
+
address@hidden :postamble
+Type: @code{(or null list)} @*
+Default Value: @code{(quote ("GNUmakefile.postamble"))}
+
+The auxilliary makefile for additional rules.
+Included just after the specific target files.
address@hidden
+
address@hidden :metasubproject
+Type: @code{boolean} @*
+Default Value: @code{nil}
+
address@hidden if this is a metasubproject.
+Usually, a subproject is determined by a parent project.  If multiple top level
+projects are grouped into a large project not maintained by EDE, then you need
+to set this to non-nil.  The only effect is that the @code{dist} rule will 
then avoid
+making a tar file.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-create :AFTER this mfilename
+Create a GNUmakefile for all Makefile targets in @var{THIS}.
address@hidden is the makefile to generate.
address@hidden deffn
+
address@hidden Method project-make-dist :AFTER this
+Build a distribution for the project based on @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-create-maybe :AFTER this mfilename
+Create a Makefile for all Makefile targets in @var{THIS} if needed.
address@hidden is the makefile to generate.
address@hidden deffn
+
address@hidden Method ede-proj-setup-buildenvironment :AFTER this &optional 
force
+Setup the build environment for project @var{THIS}.
+Handles the Makefile, or a Makefile.am configure.in combination.
+Optional argument @var{FORCE} will force items to be regenerated.
address@hidden deffn
+
address@hidden Method eieio-done-customizing :AFTER proj
+Call this when a user finishes customizing this object.
+Argument @var{PROJ} is the project to save.
address@hidden deffn
+
address@hidden Method ede-proj-dist-makefile :AFTER this
+Return the name of the Makefile with the DIST target in it for @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-commit-project :AFTER proj
+Commit any change to @var{PROJ} to its file.
address@hidden deffn
+
address@hidden Method project-dist-files :AFTER this
+Return a list of files that constitutes a distribution of @var{THIS} project.
address@hidden deffn
+
address@hidden Method ede-commit-local-variables :AFTER proj
+Commit change to local variables in @var{PROJ}.
address@hidden deffn
+
address@hidden Targets
address@hidden Targets
+
address@hidden
+* ede-target ::
+*  ede-proj-target ::
+*   ede-proj-target-makefile ::
+*    semantic-ede-proj-target-grammar ::
+*    ede-proj-target-makefile-objectcode ::
+*     ede-proj-target-makefile-archive ::
+*     ede-proj-target-makefile-program ::
+*      ede-proj-target-makefile-shared-object ::
+*    ede-proj-target-elisp ::
+*     ede-proj-target-elisp-autoloads ::
+*    ede-proj-target-makefile-miscelaneous ::
+*    ede-proj-target-makefile-info ::
+*   ede-proj-target-scheme ::
+*  project-am-target ::
+*   project-am-objectcode ::
+*    project-am-program ::
+*    project-am-header-noinst ::
+*    project-am-header-inst ::
+*   project-am-lisp ::
+*   project-am-texinfo ::
+*   project-am-man ::
address@hidden menu
+
+
address@hidden ede-target
address@hidden ede-target
address@hidden ede-target
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden ede-target
address@hidden @asis
address@hidden Children:
address@hidden,} @w{ede-emacs-target-c,} @w{ede-emacs-target-el,} 
@w{ede-emacs-target-misc,} @w{ede-linux-target-c,} @w{ede-linux-target-misc,} 
@w{ede-maven-target-java,} @w{ede-maven-target-c,} @w{ede-maven-target-misc,} 
@w{ede-simple-target,} @address@hidden,} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :name
+Type: @code{string}
+
+Name of this target.
address@hidden
+
address@hidden :path
+Type: @code{string}
+
+The path to the sources of this target.
+Relative to the path of the project it belongs to.
address@hidden
+
address@hidden :source
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Source files in this target.
address@hidden
+
address@hidden :versionsource
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Source files with a version string in them.
+These files are checked for a version string whenever the EDE version
+of the master project is changed.  When strings are found, the version
+previously there is updated.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-preprocessor-map :AFTER this
+Get the pre-processor map for project @var{THIS}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-description :AFTER obj
+Provide a speedbar description for @var{OBJ}.
address@hidden deffn
+
address@hidden Method project-compile-target :AFTER obj &optional command
+Compile the current target @var{OBJ}.
+Argument @var{COMMAND} is the command to use for compiling the target.
address@hidden deffn
+
address@hidden Method project-debug-target :AFTER obj
+Run the current project target @var{OBJ} in a debugger.
address@hidden deffn
+
address@hidden Method ede-convert-path :AFTER this path
+Convert path in a standard way for a given project.
+Default to making it project relative.
+Argument @var{THIS} is the project to convert @var{PATH} to.
address@hidden deffn
+
address@hidden Method ede-name :AFTER this
+Return the name of @var{THIS} targt.
address@hidden deffn
+
address@hidden Method ede-target-buffer-in-sourcelist :AFTER this buffer source
+Return address@hidden if object @var{THIS} is in @var{BUFFER} to a 
@var{SOURCE} list.
+Handles complex path issues.
address@hidden deffn
+
address@hidden Method eieio-speedbar-derive-line-path :AFTER obj &optional depth
+Return the path to @var{OBJ}.
+Optional @var{DEPTH} is the depth we start at.
address@hidden deffn
+
address@hidden Method ede-buffer-header-file :AFTER this buffer
+There are no default header files in EDE.
+Do a quick check to see if there is a Header tag in this buffer.
address@hidden deffn
+
address@hidden Method project-remove-file :AFTER ot fnnd
+Remove the current buffer from project target @var{OT}.
+Argument @var{FNND} is an argument.
address@hidden deffn
+
address@hidden Method ede-buffer-documentation-files :AFTER this buffer
+Check for some documentation files for @var{THIS}.
+Also do a quick check to see if there is a Documentation tag in this 
@var{BUFFER}.
address@hidden deffn
+
address@hidden Method ede-map-target-buffers :AFTER this proc
+For @var{THIS}, execute @var{PROC} on all buffers belonging to @var{THIS}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-child-description :AFTER obj
+Provide a speedbar description for a plain-child of @var{OBJ}.
+A plain child is a child element which is not an EIEIO object.
address@hidden deffn
+
address@hidden Method ede-object-keybindings :BEFORE this
+Retrieves the slot @code{keybindings} from an object of class @code{ede-target}
address@hidden deffn
+
address@hidden Method ede-description :AFTER this
+Return a description suitable for the minibuffer about @var{THIS}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-object-children :AFTER this
+Return the list of speedbar display children for @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-system-include-path :AFTER this
+Get the system include path used by project @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-object-sourcecode :BEFORE this
+Retrieves the slot @code{sourcetype} from an object of class @code{ede-target}
address@hidden deffn
+
address@hidden Method ede-expand-filename :AFTER this filename &optional force
+Return a fully qualified file name based on target @var{THIS}.
address@hidden should a a filename which occurs in a directory in which 
@var{THIS} works.
+Optional argument @var{FORCE} forces the default filename to be provided even 
if it
+doesn't exist.
address@hidden deffn
+
address@hidden Method ede-menu-items-build :AFTER obj &optional current
+Return a list of menu items for building target @var{OBJ}.
+If optional argument @var{CURRENT} is address@hidden, return sub-menu code.
address@hidden deffn
+
address@hidden Method ede-want-file-p :AFTER this file
+Return address@hidden if @var{THIS} target wants @var{FILE}.
address@hidden deffn
+
address@hidden Method ede-update-version-in-source :AFTER this version
+In sources for @var{THIS}, change version numbers to @var{VERSION}.
address@hidden deffn
+
address@hidden Method project-delete-target :AFTER ot
+Delete the current target @var{OT} from it's parent project.
address@hidden deffn
+
address@hidden Method ede-target-sourcecode :AFTER this
+Return the sourcecode objects which @var{THIS} permits.
address@hidden deffn
+
address@hidden Method eieio-speedbar-child-make-tag-lines :AFTER this depth
+Create a speedbar tag line for a child of @var{THIS}.
+It has depth @var{DEPTH}.
address@hidden deffn
+
address@hidden Method eieio-speedbar-object-buttonname :AFTER object
+Return a string to use as a speedbar button for @var{OBJECT}.
address@hidden deffn
+
address@hidden Method eieio-done-customizing :AFTER target
+Call this when a user finishes customizing @var{TARGET}.
address@hidden deffn
+
address@hidden Method project-edit-file-target :AFTER ot
+Edit the target @var{OT} associated w/ this file.
address@hidden deffn
+
address@hidden Method ede-documentation :AFTER this
+Return a list of files that provides documentation.
+Documentation is not for object @var{THIS}, but is provided by @var{THIS} for 
other
+files in the project.
address@hidden deffn
+
address@hidden Method ede-want-file-source-p :AFTER this file
+Return address@hidden if @var{THIS} target wants @var{FILE}.
address@hidden deffn
+
address@hidden Method ede-want-file-auxiliary-p :AFTER this file
+Return address@hidden if @var{THIS} target wants @var{FILE}.
address@hidden deffn
+
address@hidden Method project-add-file :AFTER ot file
+Add the current buffer into project project target @var{OT}.
+Argument @var{FILE} is the file to add.
address@hidden deffn
+
address@hidden Method ede-target-name :AFTER this
+Return the name of @var{THIS} target, suitable for make or debug style 
commands.
address@hidden deffn
+
address@hidden Method ede-object-menu :BEFORE this
+Retrieves the slot @code{menu} from an object of class @code{ede-target}
address@hidden deffn
+
address@hidden ede-proj-target
address@hidden ede-proj-target
address@hidden ede-proj-target
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-proj-target-makefile},} @w{ede-proj-target-aux,} 
@address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :name
+Type: @code{string}
+
+Name of this target.
address@hidden
+
address@hidden :path
+Type: @code{string}
+
+The path to the sources of this target.
+Relative to the path of the project it belongs to.
address@hidden
+
address@hidden :auxsource
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Auxilliary source files included in this target.
+Each of these is considered equivalent to a source file, but it is not
+distributed, and each should have a corresponding rule to build it.
address@hidden
+
address@hidden :compiler
+Type: @code{(or null symbol)} @*
+Default Value: @code{nil}
+
+The compiler to be used to compile this object.
+This should be a symbol, which contains the object defining the compiler.
+This enables save/restore to do so by name, permitting the sharing
+of these compiler resources, and global customization thereof.
address@hidden
+
address@hidden :linker
+Type: @code{(or null symbol)} @*
+Default Value: @code{nil}
+
+The linker to be used to link compiled sources for this object.
+This should be a symbol, which contains the object defining the linker.
+This enables save/restore to do so by name, permitting the sharing
+of these linker resources, and global customization thereof.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method project-compile-target :AFTER obj &optional command
+Compile the current target @var{OBJ}.
+Argument @var{COMMAND} is the command to use for compiling the target.
address@hidden deffn
+
address@hidden Method project-debug-target :AFTER obj
+Run the current project target @var{OBJ} in a debugger.
address@hidden deffn
+
address@hidden Method ede-proj-configure-add-missing :AFTER this
+Query if any files needed by @var{THIS} provided by automake are missing.
+Results in --add-missing being passed to automake.
address@hidden deffn
+
address@hidden Method ede-proj-flush-autoconf :AFTER this
+Flush the configure file (current buffer) to accomodate @var{THIS}.
+By flushing, remove any cruft that may be in the file.  Subsequent
+calls to @dfn{ede-proj-tweak-autoconf} can restore items removed by flush.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method project-remove-file :AFTER target file
+For @var{TARGET}, remove @var{FILE}.
address@hidden must be massaged by @dfn{ede-convert-path}.
address@hidden deffn
+
address@hidden Method ede-proj-configure-create-missing :AFTER this
+Add any missing files for @var{THIS} by creating them.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this &optional 
moresource
+Insert variables needed by target @var{THIS}.
+Optional argument @var{MORESOURCE} is a list of additional sources to add to 
the
+sources variable.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-post-variables :AFTER 
this
+Insert variables needed by target @var{THIS} in Makefile.am after SOURCES.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-dependencies :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Argument @var{THIS} is the target that should insert stuff.
address@hidden deffn
+
address@hidden Method ede-proj-linkers :AFTER obj
+List of linkers being used by @var{OBJ}.
+If the @code{linker} slot is empty, concoct one on a first match found
+basis for any given type from the @code{availablelinkers} slot.
+Otherwise, return the @code{linker} slot.
+Converts all symbols into the objects to be used.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-garbage-patterns :AFTER this
+Return a list of patterns that are considered garbage to @var{THIS}.
+These are removed with make clean.
address@hidden deffn
+
address@hidden Method ede-proj-tweak-autoconf :AFTER this
+Tweak the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-compilers :AFTER obj
+List of compilers being used by @var{OBJ}.
+If the @code{compiler} slot is empty, concoct one on a first match found
+basis for any given type from the @code{availablecompilers} slot.
+Otherwise, return the @code{compiler} slot.
+Converts all symbols into the objects to be used.
address@hidden deffn
+
address@hidden Method project-delete-target :AFTER this
+Delete the current target @var{THIS} from it's parent project.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-target-name :AFTER this
+Return the name of the main target for @var{THIS} target.
address@hidden deffn
+
address@hidden Method eieio-done-customizing :AFTER target
+Call this when a user finishes customizing this object.
+Argument @var{TARGET} is the project we are completing customization on.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-user-rules :AFTER this
+Insert user specified rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method project-add-file :AFTER this file
+Add to target @var{THIS} the current buffer represented as @var{FILE}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-pre-variables :AFTER 
this
+Insert variables needed by target @var{THIS} in Makefile.am before SOURCES.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-filepatterns :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Argument @var{THIS} is the target that should insert stuff.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-dependency-files :AFTER this
+Return a list of source files to convert to dependencies.
+Argument @var{THIS} is the target to get sources from.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-source-variables :AFTER this 
&optional moresource
+Insert the source variables needed by @var{THIS}.
+Optional argument @var{MORESOURCE} is a list of additional sources to add to 
the
+sources variable.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile
address@hidden ede-proj-target-makefile
address@hidden ede-proj-target-makefile
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile
address@hidden @asis
address@hidden Children:
address@hidden@xref{semantic-ede-proj-target-grammar},} @address@hidden,} 
@address@hidden,} @address@hidden,} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :makefile
+Type: @code{string} @*
+Default Value: @code{"Makefile"}
+
+File name of generated Makefile.
address@hidden
+
address@hidden :partofall
+Type: @code{boolean} @*
+Default Value: @code{t}
+
+Non @code{nil} means the rule created is part of the all target.
+Setting this to @code{nil} creates the rule to build this item, but does not
+include it in the ALL`all:' rule.
address@hidden
+
address@hidden :configuration-variables
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Makefile variables appended to use in different configurations.
+These variables are used in the makefile when a configuration becomes active.
+Target variables are always renamed such as foo_CFLAGS, then included into
+commands where the variable would usually appear.
address@hidden
+
address@hidden :rules
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Arbitrary rules and dependencies needed to make this target.
+It is safe to leave this blank.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-dependencies :AFTER this
+Return a string representing the dependencies for @var{THIS}.
+Some compilers only use the first element in the dependencies, others
+have a list of intermediates (object files), and others don't care.
+This allows customization of how these elements appear.
address@hidden deffn
+
address@hidden Method project-compile-target :AFTER obj &optional command
+Compile the current target program @var{OBJ}.
+Optional argument @var{COMMAND} is the s the alternate command to use.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this &optional 
moresource
+Insert variables needed by target @var{THIS}.
+Optional argument @var{MORESOURCE} is a list of additional sources to add to 
the
+sources variable.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-commands :AFTER this
+Insert the commands needed by target @var{THIS}.
+For targets, insert the commands needed by the chosen compiler.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-configuration-variables :AFTER this 
configuration
+Return a list of configuration variables from @var{THIS}.
+Use @var{CONFIGURATION} as the current configuration to query.
address@hidden deffn
+
address@hidden semantic-ede-proj-target-grammar
address@hidden semantic-ede-proj-target-grammar
address@hidden semantic-ede-proj-target-grammar
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden semantic-ede-proj-target-grammar
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-compile-target :AFTER obj
+Compile all sources in a Lisp target @var{OBJ}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-buffer-mine :AFTER this buffer
+Return @code{t} if object @var{THIS} lays claim to the file in @var{BUFFER}.
+Lays claim to all -by.el, and -wy.el files.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-dependencies :AFTER this
+Insert dist dependencies, or intermediate targets.
+This makes sure that all grammar lisp files are created before the dist
+runs, so they are always up to date.
+Argument @var{THIS} is the target that should insert stuff.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-objectcode
address@hidden ede-proj-target-makefile-objectcode
address@hidden ede-proj-target-makefile-objectcode
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-objectcode
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-proj-target-makefile-archive},} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :configuration-variables
+Type: @code{list} @*
+Default Value: @code{("debug" ("CFLAGS" . "-g") ("LDFLAGS" . "-g"))}
+
address@hidden
address@hidden table
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-buffer-header-file :AFTER this buffer
+There are no default header files.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this &optional 
moresource
+Insert variables needed by target @var{THIS}.
+Optional argument @var{MORESOURCE} is not used.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-dependency-files :AFTER this
+Return a list of source files to convert to dependencies.
+Argument @var{THIS} is the target to get sources from.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-archive
address@hidden ede-proj-target-makefile-archive
address@hidden ede-proj-target-makefile-archive
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-archive
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Create the make rule needed to create an archive for @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-source-variables :PRIMARY this
+Insert bin_PROGRAMS variables needed by target @var{THIS}.
+We aren't acutally inserting SOURCE details, but this is used by the
+Makefile.am generator, so use it to add this important bin program.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-program
address@hidden ede-proj-target-makefile-program
address@hidden ede-proj-target-makefile-program
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-program
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-proj-target-makefile-shared-object}.}
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :ldlibs
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Libraries, such as "m" or "Xt" which this program depends on.
+The linker flag "-l" is automatically prepended.  Do not include a "lib"
+prefix, or a ".so" suffix.
+
+Note: Currently only used for Automake projects.
address@hidden
+
address@hidden :ldflags
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Additional flags to add when linking this target.
+Use ldlibs to add addition libraries.  Use this to specify specific
+options to the linker.
+
+Note: Not currently used.  This bug needs to be fixed.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method project-debug-target :AFTER obj
+Debug a program target @var{OBJ}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed by @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-post-variables :AFTER 
this
+Insert bin_PROGRAMS variables needed by target @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-pre-variables :AFTER 
this
+Insert bin_PROGRAMS variables needed by target @var{THIS}.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-shared-object
address@hidden ede-proj-target-makefile-shared-object
address@hidden ede-proj-target-makefile-shared-object
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-shared-object
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method ede-proj-configure-add-missing :AFTER this
+Query if any files needed by @var{THIS} provided by automake are missing.
+Results in --add-missing being passed to automake.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-post-variables :AFTER 
this
+Insert bin_PROGRAMS variables needed by target @var{THIS}.
+We need to override -program which has an LDADD element.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-target-name :AFTER this
+Return the name of the main target for @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-automake-pre-variables :AFTER 
this
+Insert bin_PROGRAMS variables needed by target @var{THIS}.
+We aren't acutally inserting SOURCE details, but this is used by the
+Makefile.am generator, so use it to add this important bin program.
address@hidden deffn
+
+
address@hidden ede-proj-target-elisp
address@hidden ede-proj-target-elisp
address@hidden ede-proj-target-elisp
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-elisp
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-proj-target-elisp-autoloads}.}
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :aux-packages
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Additional packages needed.
+There should only be one toplevel package per auxiliary tool needed.
+These packages location is found, and added to the compile time
+load path.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method project-compile-target :AFTER obj
+Compile all sources in a Lisp target @var{OBJ}.
+Bonus: Return a cons cell: (COMPILED . UPTODATE).
address@hidden deffn
+
address@hidden Method ede-proj-flush-autoconf :AFTER this
+Flush the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-buffer-mine :AFTER this buffer
+Return @code{t} if object @var{THIS} lays claim to the file in @var{BUFFER}.
+Lays claim to all .elc files that match .el files in this target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-tweak-autoconf :AFTER this
+Tweak the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-update-version-in-source :AFTER this version
+In a Lisp file, updated a version string for @var{THIS} to @var{VERSION}.
+There are standards in Elisp files specifying how the version string
+is found, such as a @code{-version} variable, or the standard header.
address@hidden deffn
+
address@hidden ede-proj-target-elisp-autoloads
address@hidden ede-proj-target-elisp-autoloads
address@hidden ede-proj-target-elisp-autoloads
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-elisp-autoloads
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :aux-packages
+Type: @code{list} @*
+Default Value: @code{("cedet-autogen")}
+
address@hidden
address@hidden :autoload-file
+Type: @code{string} @*
+Default Value: @code{"loaddefs.el"}
+
+The file that autoload definitions are placed in.
+There should be one load defs file for a given package.  The load defs are 
created
+for all Emacs Lisp sources that exist in the directory of the created target.
address@hidden
+
address@hidden :autoload-dirs
+Type: @code{list} @*
+Default Value: @code{nil}
+
+The directories to scan for autoload definitions.
+If @code{nil} defaults to the current directory.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-dependencies :AFTER this
+Return a string representing the dependencies for @var{THIS}.
+Always return an empty string for an autoloads generator.
address@hidden deffn
+
address@hidden Method project-compile-target :AFTER obj
+Create or update the autoload target.
address@hidden deffn
+
address@hidden Method ede-proj-flush-autoconf :AFTER this
+Flush the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-buffer-mine :AFTER this buffer
+Return @code{t} if object @var{THIS} lays claim to the file in @var{BUFFER}.
+Lays claim to all .elc files that match .el files in this target.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-dependencies :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Emacs Lisp autoload files ship the generated .el files.
+Argument @var{THIS} is the target which needs to insert an info file.
address@hidden deffn
+
address@hidden Method ede-proj-tweak-autoconf :AFTER this
+Tweak the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-update-version-in-source :AFTER this version
+In a Lisp file, updated a version string for @var{THIS} to @var{VERSION}.
+There are standards in Elisp files specifying how the version string
+is found, such as a @code{-version} variable, or the standard header.
address@hidden deffn
+
address@hidden Method ede-proj-compilers :AFTER obj
+List of compilers being used by @var{OBJ}.
+If the @code{compiler} slot is empty, get the car of the compilers list.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-filepatterns :AFTER this
+Insert any symbols that the DIST rule should distribute.
+Emacs Lisp autoload files ship the generated .el files.
+Argument @var{THIS} is the target which needs to insert an info file.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-source-variables :AFTER this 
&optional moresource
+Insert the source variables needed by @var{THIS}.
+Optional argument @var{MORESOURCE} is a list of additional sources to add to 
the
+sources variable.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-miscelaneous
address@hidden ede-proj-target-makefile-miscelaneous
address@hidden ede-proj-target-makefile-miscelaneous
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-miscelaneous
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :submakefile
+Type: @code{string} @*
+Default Value: @code{""}
+
+Miscellaneous sources which have a specialized makefile.
+The sub-makefile is used to build this target.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Create the make rule needed to create an archive for @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-dependency-files :AFTER this
+Return a list of files which @var{THIS} target depends on.
address@hidden deffn
+
+
address@hidden ede-proj-target-makefile-info
address@hidden ede-proj-target-makefile-info
address@hidden ede-proj-target-makefile-info
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-makefile-info
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :mainmenu
+Type: @code{string} @*
+Default Value: @code{""}
+
+The main menu resides in this file.
+All other sources should be included independently.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-configure-add-missing :AFTER this
+Query if any files needed by @var{THIS} provided by automake are missing.
+Results in --add-missing being passed to automake.
address@hidden deffn
+
address@hidden Method object-write :AFTER this
+Before committing any change to @var{THIS}, make sure the mainmenu is first.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-sourcevar :AFTER this
+Return the variable name for @var{THIS}'s sources.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-dependencies :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Texinfo files want to insert generated `.info' files.
+Argument @var{THIS} is the target which needs to insert an info file.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-target-name :AFTER this
+Return the name of the main target for @var{THIS} target.
address@hidden deffn
+
address@hidden Method ede-documentation :AFTER this
+Return a list of files that provides documentation.
+Documentation is not for object @var{THIS}, but is provided by @var{THIS} for 
other
+files in the project.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-dist-filepatterns :AFTER this
+Insert any symbols that the DIST rule should depend on.
+Texinfo files want to insert generated `.info' files.
+Argument @var{THIS} is the target which needs to insert an info file.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-source-variables :AFTER this 
&optional moresource
+Insert the source variables needed by @var{THIS} info target.
+Optional argument @var{MORESOURCE} is a list of additional sources to add to 
the
+sources variable.
+Does the usual for Makefile mode, but splits source into two variables
+when working in Automake mode.
address@hidden deffn
+
address@hidden ede-proj-target-scheme
address@hidden ede-proj-target-scheme
address@hidden ede-proj-target-scheme
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-proj-target-scheme
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :interpreter
+Type: @code{string} @*
+Default Value: @code{"guile"}
+
+The preferred interpreter for this code.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-tweak-autoconf :AFTER this
+Tweak the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
+
address@hidden project-am-target
address@hidden project-am-target
address@hidden project-am-target
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-target
address@hidden @asis
address@hidden Children:
address@hidden@xref{project-am-objectcode},} @w{project-am-header,} 
@address@hidden,} @address@hidden,} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-compile-target-command :AFTER this
+Default target to use when compiling a given target.
address@hidden deffn
+
address@hidden Method project-make-dist :AFTER this
+Run the current project in the debugger.
address@hidden deffn
+
address@hidden Method project-edit-file-target :AFTER obj
+Edit the target associated w/ this file.
address@hidden deffn
+
address@hidden project-am-objectcode
address@hidden project-am-objectcode
address@hidden project-am-objectcode
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-objectcode
address@hidden @asis
address@hidden Children:
address@hidden@xref{project-am-program},} @w{project-am-lib.}
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object type.
address@hidden deffn
+
address@hidden Method project-debug-target :AFTER obj
+Run the current project target in a debugger.
address@hidden deffn
+
address@hidden Method project-compile-target-command :AFTER this
+Default target to use when compiling an object code target.
address@hidden deffn
+
address@hidden Method ede-buffer-header-file :AFTER this buffer
+There are no default header files.
address@hidden deffn
+
address@hidden project-am-program
address@hidden project-am-program
address@hidden project-am-program
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-program
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :ldadd @*
+Default Value: @code{nil}
+
+Additional LD args.
address@hidden
address@hidden table
address@hidden table
+
address@hidden project-am-header-noinst
address@hidden project-am-header-noinst
address@hidden project-am-header-noinst
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @w{project-am-header.}
address@hidden @code
address@hidden project-am-header-noinst
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object.
address@hidden deffn
+
address@hidden project-am-header-inst
address@hidden project-am-header-inst
address@hidden project-am-header-inst
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @w{project-am-header.}
address@hidden @code
address@hidden project-am-header-inst
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object.
address@hidden deffn
+
address@hidden project-am-lisp
address@hidden project-am-lisp
address@hidden project-am-lisp
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-lisp
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object.
address@hidden deffn
+
address@hidden project-am-texinfo
address@hidden project-am-texinfo
address@hidden project-am-texinfo
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-texinfo
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :include @*
+Default Value: @code{nil}
+
+Additional texinfo included in this one.
address@hidden
+
address@hidden table
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object type.
address@hidden deffn
+
address@hidden Method project-compile-target-command :AFTER this
+Default target t- use when compling a texinfo file.
address@hidden deffn
+
address@hidden Method ede-documentation :AFTER this
+Return a list of files that provides documentation.
+Documentation is not for object @var{THIS}, but is provided by @var{THIS} for 
other
+files in the project.
address@hidden deffn
+
address@hidden project-am-man
address@hidden  node-name,  next,  previous,  up
address@hidden project-am-man
address@hidden project-am-man
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-speedbar
address@hidden @code
address@hidden eieio-speedbar-directory-button
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden project-am-man
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method project-am-macro :AFTER this
+Return the default macro to 'edit' for this object type.
address@hidden deffn
+
address@hidden Sourcecode
address@hidden Sourcecode
+
+The source code type is an object designed to associated files with
+targets.
+
address@hidden
+* ede-sourcecode ::
address@hidden menu
+
+
address@hidden ede-sourcecode
address@hidden ede-sourcecode
address@hidden ede-sourcecode
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-instance-inheritor
address@hidden @code
address@hidden ede-sourcecode
+No children
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :parent-instance
+Type: @code{eieio-instance-inheritor-child}
+
+The parent of this instance.
+If a slot of this class is reference, and is unbound, then  the parent
+is checked for a value.
address@hidden
+
address@hidden :name
+Type: @code{string}
+
+The name of this type of source code.
+Such as "C" or "Emacs Lisp"
address@hidden
+
address@hidden :sourcepattern
+Type: @code{string} @*
+Default Value: @code{".*"}
+
+Emacs regex matching sourcecode this target accepts.
address@hidden
+
address@hidden :auxsourcepattern
+Type: @code{(or null string)} @*
+Default Value: @code{nil}
+
+Emacs regex matching auxiliary source code this target accepts.
+Aux source are source code files needed for compilation, which are not comiled
+themselves.
address@hidden
+
address@hidden :enable-subdirectories
+Type: @code{boolean} @*
+Default Value: @code{nil}
+
+Non @code{nil} if this sourcecode type uses subdirectores.
+If sourcecode always lives near the target creating it, this should be nil.
+If sourcecode can, or typically lives in a subdirectory of the owning
+target, set this to t.
address@hidden
+
address@hidden :garbagepattern
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Shell file regex matching files considered as garbage.
+This is a list of items added to an @code{rm} command when executing a 
@code{clean}
+type directive.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-want-any-files-p :AFTER this filenames
+Return address@hidden if @var{THIS} will accept any files in @var{FILENAMES}.
address@hidden deffn
+
address@hidden Method ede-want-any-source-files-p :AFTER this filenames
+Return address@hidden if @var{THIS} will accept any source files in 
@var{FILENAMES}.
address@hidden deffn
+
address@hidden Method ede-want-any-auxiliary-files-p :AFTER this filenames
+Return address@hidden if @var{THIS} will accept any aux files in 
@var{FILENAMES}.
address@hidden deffn
+
address@hidden Method ede-buffer-header-file :AFTER this filename
+Return a list of file names of header files for @var{THIS} with @var{FILENAME}.
+Used to guess header files, but uses the auxsource regular expression.
address@hidden deffn
+
address@hidden Method ede-want-file-p :AFTER this filename
+Return address@hidden if sourcecode definition @var{THIS} will take 
@var{FILENAME}.
address@hidden deffn
+
address@hidden Method ede-want-file-source-p :AFTER this filename
+Return address@hidden if @var{THIS} will take @var{FILENAME} as an auxiliary .
address@hidden deffn
+
address@hidden Method ede-want-file-auxiliary-p :AFTER this filename
+Return address@hidden if @var{THIS} will take @var{FILENAME} as an auxiliary .
address@hidden deffn
+
address@hidden Compilers
address@hidden Compilers
+
+The compiler object is designed to associate source code with
+compilers.  The target then references the compilers it can use.
+When the makefile is created, this object type knows how to create
+compile commands.
+
address@hidden
+* ede-compilation-program ::
+*  ede-compiler ::
+*   ede-object-compiler ::
+*  ede-linker ::
address@hidden menu
+
+
address@hidden ede-compilation-program
address@hidden ede-compilation-program
address@hidden ede-compilation-program
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-instance-inheritor
address@hidden @code
address@hidden ede-compilation-program
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-compiler},} @address@hidden
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :parent-instance
+Type: @code{eieio-instance-inheritor-child}
+
+The parent of this instance.
+If a slot of this class is reference, and is unbound, then  the parent
+is checked for a value.
address@hidden
+
address@hidden :name
+Type: @code{string}
+
+Name of this type of compiler.
address@hidden
+
address@hidden :variables
+Type: @code{list}
+
+Variables needed in the Makefile for this compiler.
+An assoc list where each element is (VARNAME . VALUE) where VARNAME
+is a string, and VALUE is either a string, or a list of strings.
+For example, GCC would define CC=gcc, and emacs would define EMACS=emacs.
address@hidden
+
address@hidden :sourcetype
+Type: @code{list}
+
+A list of @code{ede-sourcecode} @xref{ede-sourcecode}. objects this class will 
handle.
+This is used to match target objects with the compilers and linkers
+they can use, and which files this object is interested in.
address@hidden
+
address@hidden :rules
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Auxiliary rules needed for this compiler to run.
+For example, yacc/lex files need additional chain rules, or inferences.
address@hidden
+
address@hidden :commands
+Type: @code{list}
+
+The commands used to execute this compiler.
+The object which uses this compiler will place these commands after
+it's rule definition.
address@hidden
+
address@hidden :autoconf
+Type: @code{list} @*
+Default Value: @code{nil}
+
+Autoconf function to call if this type of compiler is used.
+When a project is in Automake mode, this defines the autoconf function to
+call to initialize automake to use this compiler.
+For example, there may be multiple C compilers, but they all probably
+use the same autoconf form.
address@hidden
+
address@hidden :objectextention
+Type: @code{string}
+
+A string which is the extention used for object files.
+For example, C code uses .o on unix, and Emacs Lisp uses .elc.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-flush-autoconf :AFTER this
+Flush the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-rules :AFTER this
+Insert rules needed for @var{THIS} compiler object.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this
+Insert variables needed by the compiler @var{THIS}.
address@hidden deffn
+
address@hidden Method ede-proj-makefile-insert-commands :AFTER this
+Insert the commands needed to use compiler @var{THIS}.
+The object creating makefile rules must call this method for the
+compiler it decides to use after inserting in the rule.
address@hidden deffn
+
address@hidden Method ede-object-sourcecode :AFTER this
+Retrieves the slot @code{sourcetype} from an object of class 
@code{ede-compilation-program}
address@hidden deffn
+
address@hidden Method ede-proj-tweak-autoconf :AFTER this
+Tweak the configure file (current buffer) to accomodate @var{THIS}.
address@hidden deffn
+
+
address@hidden ede-compiler
address@hidden ede-compiler
address@hidden ede-compiler
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-instance-inheritor
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-compiler
address@hidden @asis
address@hidden Children:
address@hidden@xref{ede-object-compiler},} 
@w{semantic-ede-grammar-compiler-class.}
address@hidden table
+
address@hidden table
+
address@hidden table
+
address@hidden table
address@hidden table
+
+  Create a new object with name NAME of class type ede-compiler
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :parent-instance
+Type: @code{eieio-instance-inheritor-child}
+
+The parent of this instance.
+If a slot of this class is reference, and is unbound, then  the parent
+is checked for a value.
address@hidden
+
address@hidden :name
+Type: @code{string}
+
+Name of this type of compiler.
address@hidden
+
address@hidden :variables
+Type: @code{list}
+
+Variables needed in the Makefile for this compiler.
+An assoc list where each element is (VARNAME . VALUE) where VARNAME
+is a string, and VALUE is either a string, or a list of strings.
+For example, GCC would define CC=gcc, and emacs would define EMACS=emacs.
address@hidden
+
address@hidden :sourcetype
+Type: @code{list}
+
+A list of @code{ede-sourcecode} @xref{ede-sourcecode}. objects this class will 
handle.
+This is used to match target objects with the compilers and linkers
+they can use, and which files this object is interested in.
address@hidden
+
address@hidden :commands
+Type: @code{list}
+
+The commands used to execute this compiler.
+The object which uses this compiler will place these commands after
+it's rule definition.
address@hidden
+
address@hidden :objectextention
+Type: @code{string}
+
+A string which is the extention used for object files.
+For example, C code uses .o on unix, and Emacs Lisp uses .elc.
address@hidden
+
address@hidden :makedepends
+Type: @code{boolean} @*
+Default Value: @code{nil}
+
address@hidden if this compiler can make dependencies.
address@hidden
+
address@hidden :uselinker
+Type: @code{boolean} @*
+Default Value: @code{nil}
+
address@hidden if this compiler creates code that can be linked.
+This requires that the containing target also define a list of available
+linkers that can be used.
address@hidden
+
address@hidden table
+
address@hidden table
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-insert-object-variables :AFTER this 
targetname sourcefiles
+Insert an OBJ variable to specify object code to be generated for @var{THIS}.
+The name of the target is @var{TARGETNAME} as a string.  @var{SOURCEFILES} is 
the list of
+files to be objectified.
+Not all compilers do this.
address@hidden deffn
+
address@hidden Method ede-compiler-intermediate-objects-p :AFTER this
+Return address@hidden if @var{THIS} has intermediate object files.
+If this compiler creates code that can be linked together,
+then the object files created by the compiler are considered intermediate.
address@hidden deffn
+
address@hidden Method ede-compiler-intermediate-object-variable :AFTER this 
targetname
+Return a string based on @var{THIS} representing a make object variable.
address@hidden is the name of the target that these objects belong to.
address@hidden deffn
+
+
address@hidden ede-object-compiler
address@hidden ede-object-compiler
address@hidden ede-object-compiler
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-instance-inheritor
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-object-compiler
+No children
address@hidden table
address@hidden table
address@hidden table
address@hidden table
address@hidden table
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :uselinker
+Type: @code{boolean} @*
+Default Value: @code{t}
+
address@hidden
address@hidden :dependencyvar
+Type: @code{list}
+
+A variable dedicated to dependency generation.
address@hidden
address@hidden table
address@hidden table
+
address@hidden Specialized Methods
+
address@hidden Method ede-proj-makefile-insert-variables :AFTER this
+Insert variables needed by the compiler @var{THIS}.
address@hidden deffn
+
address@hidden ede-linker
address@hidden ede-linker
address@hidden ede-linker
+
address@hidden @asis
address@hidden Inheritance Tree:
address@hidden @code
address@hidden eieio-instance-inheritor
address@hidden @code
address@hidden @address@hidden
address@hidden @code
address@hidden ede-linker
+No children
address@hidden table
+
address@hidden table
+
address@hidden table
address@hidden table
+
+  Create a new object with name NAME of class type ede-linker
+
address@hidden @asis
address@hidden Slots:
+
address@hidden @code
address@hidden :name
+Type: @code{string}
+
+Name of this type of compiler.
address@hidden
+
address@hidden :variables
+Type: @code{list}
+
+Variables needed in the Makefile for this compiler.
+An assoc list where each element is (VARNAME . VALUE) where VARNAME
+is a string, and VALUE is either a string, or a list of strings.
+For example, GCC would define CC=gcc, and emacs would define EMACS=emacs.
address@hidden
+
address@hidden :sourcetype
+Type: @code{list}
+
+A list of @code{ede-sourcecode} @xref{ede-sourcecode}. objects this class will 
handle.
+This is used to match target objects with the compilers and linkers
+they can use, and which files this object is interested in.
address@hidden
+
address@hidden :commands
+Type: @code{list}
+
+The commands used to execute this compiler.
+The object which uses this compiler will place these commands after
+it's rule definition.
address@hidden
+
address@hidden :objectextention
+Type: @code{string}
+
+A string which is the extention used for object files.
+For example, C code uses .o on unix, and Emacs Lisp uses .elc.
address@hidden
+
address@hidden table
address@hidden table
+
address@hidden

Index: eieio.texi
===================================================================
RCS file: eieio.texi
diff -N eieio.texi
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ eieio.texi  7 Oct 2009 01:10:53 -0000       1.1
@@ -0,0 +1,1911 @@
+\input texinfo
address@hidden ../../info/eieio
address@hidden TITLE Enhanced Implementation of Emacs Interpreted Objects
address@hidden AUTHOR Eric M. Ludlam
address@hidden @value{TITLE}
+
address@hidden 
*************************************************************************
address@hidden @ Header
address@hidden 
*************************************************************************
+
address@hidden
+This manual documents EIEIO, an object framework for Emacs Lisp.
+
+Copyright @copyright{} 2007, 2008, 2009 Free Software Foundation, Inc.
+
address@hidden
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license
+is included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom.''
address@hidden quotation
address@hidden copying
+
address@hidden
address@hidden
+START-INFO-DIR-ENTRY
+* eieio: (eieio).       Objects for Emacs
+END-INFO-DIR-ENTRY
address@hidden format
address@hidden ifinfo
+
address@hidden
address@hidden @address@hidden
address@hidden 4
address@hidden by @value{AUTHOR}
address@hidden titlepage
address@hidden
+
address@hidden eieio{}
address@hidden
address@hidden macro
+
address@hidden Top, Quick Start, (dir), (dir)
address@hidden  node-name,  next,  previous,  up
address@hidden EIEIO
+
address@hidden (``Enhanced Implementation of Emacs Interpreted Objects'') is
+a CLOS (Common Lisp Object System) compatibility layer for Emacs Lisp.
+It provides a framework for writing object-oriented applications in
+Emacs.
+
address@hidden
address@hidden
address@hidden ifnottex
+
address@hidden
+* Quick Start::           Quick start for EIEIO.
+* Introduction::          Why use @eieio{}?  Basic overview, samples list.
+* Building Classes::      How to write new class structures.
+* Making New Objects::    How to construct new objects.
+* Accessing Slots::       How to access a slot.
+* Writing Methods::       How to write a method.
address@hidden * Method Invocation::     How methods are invoked.
+* Predicates::            Class-p, Object-p, etc-p.
+* Association Lists::     List of objects as association lists.
+* Customizing::           Customizing objects.
+* Introspection::         Looking inside a class.
+* Base Classes::          Additional classes you can inherit from.
+* Browsing::              Browsing your class lists.
+* Class Values::          Displaying information about a class or object.
+* Default Superclass::    The root superclasses.
+* Signals::               When you make errors
+* Naming Conventions::    Name your objects in an Emacs friendly way.
+* CLOS compatibility::    What are the differences?
+* Wish List::             Things about EIEIO that could be improved.
+* Function Index::
address@hidden menu
+
address@hidden Quick Start
address@hidden Quick Start
+
address@hidden provides an Object Oriented layer for Emacs Lisp.  You can
+use @eieio{} to create classes, methods for those classes, and
+instances of classes.
+
+Here is a simple example of a class named @code{record}, containing
+three slots named @code{name}, @code{birthday}, and @code{phone}:
+
address@hidden
+(defclass record () ; No superclasses
+  ((name :initarg :name
+         :initform ""
+         :type string
+         :custom string
+         :documentation "The name of a person.")
+   (birthday :initarg :birthday
+             :initform "Jan 1, 1970"
+             :custom string
+             :type string
+             :documentation "The person's birthday.")
+   (phone :initarg :phone
+          :initform ""
+          :documentation "Phone number."))
+  "A single record for tracking people I know.")
address@hidden example
+
+Each class can have methods, which are defined like this:
+
address@hidden
+(defmethod call-record ((rec record) &optional scriptname)
+  "Dial the phone for the record REC.
+Execute the program SCRIPTNAME to dial the phone."
+  (message "Dialing the phone for %s"  (oref rec name))
+  (shell-command (concat (or scriptname "dialphone.sh")
+                         " "
+                         (oref rec phone))))
address@hidden example
+
address@hidden
+In this example, the first argument to @code{call-record} is a list,
+of the form (@var{varname} @var{classname}).  @var{varname} is the
+name of the variable used for the first argument; @var{classname} is
+the name of the class that is expected as the first argument for this
+method.
+
address@hidden dispatches methods based on the type of the first argument.
+You can have multiple methods with the same name for different classes
+of object.  When the @code{call-record} method is called, the first
+argument is examined to determine the class of that argument, and the
+method matching the input type is then executed.
+
+Once the behavior of a class is defined, you can create a new
+object of type @code{record}.  Objects are created by calling the
+constructor.  The constructor is a function with the same name as your
+class which returns a new instance of that class.  Here is an example:
+
address@hidden
+(setq rec (record "Eric" :name "Eric" :birthday "June" :phone "555-5555"))
address@hidden example
+
address@hidden
+The first argument is the name given to this instance.  Each instance
+is given a name, so different instances can be easily distinguished
+when debugging.
+
+It can be a bit repetitive to also have a :name slot.  To avoid doing
+this, it is sometimes handy to use the base class @code{eieio-named}.
address@hidden
+
+Calling methods on an object is a lot like calling any function.  The
+first argument should be an object of a class which has had this
+method defined for it.  In this example it would look like this:
+
address@hidden
+(call-record rec)
address@hidden example
+
address@hidden
+or
+
address@hidden
+(call-record rec "my-call-script")
address@hidden example
+
+In these examples, @eieio{} automatically examines the class of
address@hidden, and ensures that the method defined above is called.  If
address@hidden is some other class lacking a @code{call-record} method, or
+some other data type, Emacs signals a @code{no-method-definition}
+error. @ref{Signals}.
+
address@hidden Introduction
address@hidden  node-name,  next,  previous,  up
address@hidden Introduction
+
+Due to restrictions in the Emacs Lisp language, CLOS cannot be
+completely supported, and a few functions have been added in place of
+setf.
+
address@hidden supports the following features:
+
address@hidden
address@hidden
+A structured framework for the creation of basic classes with attributes
+and methods using singular inheritance similar to CLOS.
address@hidden
+Type checking, and slot unbinding.
address@hidden
+Method definitions similar to CLOS.
address@hidden
+Simple and complex class browsers.
address@hidden
+Edebug support for methods.
address@hidden
+Imenu updates.
address@hidden
+Byte compilation support of methods.
address@hidden
+Help system extensions for classes and methods.
address@hidden
+Automatic texinfo documentation generator.
address@hidden
+Several base classes for interesting tasks.
address@hidden
+Simple test suite.
address@hidden
+Public and private classifications for slots (extensions to CLOS)
address@hidden
+Customization support in a class (extension to CLOS)
address@hidden enumerate
+
+Here are some CLOS features that @eieio{} presently lacks:
+
address@hidden @asis
address@hidden Complete @code{defclass} tag support
+All CLOS tags are currently supported, but the following are not
+currently implemented correctly:
+
address@hidden @code
address@hidden :metaclass
+There is only one base superclass for all @eieio{} classes, which is
+the @code{eieio-default-superclass}.
address@hidden :default-initargs
+Each slot has an @code{:initarg} tag, so this is not really necessary.
address@hidden table
+
address@hidden Mock object initializers
+Each class contains a mock object used for fast initialization of
+instantiated objects.  Using functions with side effects on object slot
+values can potentially cause modifications in the mock object.  @eieio{}
+should use a deep copy but currently does not.
+
address@hidden @code{:around} method tag
+This CLOS method tag is non-functional.
+
address@hidden table
+
address@hidden Building Classes
address@hidden  node-name,  next,  previous,  up
address@hidden Building Classes
+
+A @dfn{class} is a definition for organizing data and methods
+together.  An @eieio{} class has structures similar to the classes
+found in other object-oriented (OO) languages.
+
+To create a new class, use the @code{defclass} macro:
+
address@hidden defclass class-name superclass-list slot-list &rest 
options-and-doc
+
+Create a new class named @var{class-name}.  The class is represented
+by a self-referential symbol with the name @var{class-name}.  @eieio{}
+stores the structure of the class as a symbol property of
address@hidden (@pxref{Symbol Components,,,elisp,GNU Emacs Lisp
+Reference Manual}).
+
+The @var{class-name} symbol's variable documentation string is a
+modified version of the doc string found in @var{options-and-doc}.
+Each time a method is defined, the symbol's documentation string is
+updated to include the methods documentation as well.
+
+The parent classes for @var{class-name} is @var{superclass-list}.
+Each element of @var{superclass-list} must be a class.  These classes
+are the parents of the class being created.  Every slot that appears
+in each parent class is replicated in the new class.
+
+If two parents share the same slot name, the parent which appears in
+the @var{superclass-list} first sets the tags for that slot.  If the
+new class has a slot with the same name as the parent, the new slot
+overrides the parent's slot.
address@hidden defmac
+
address@hidden
+Whenever defclass is used to create a new class, two predicates are
+created for it, named @address@hidden and
address@hidden@var{CLASS-NAME}-child-p}:
+
address@hidden CLASS-NAME-p object
+Return @code{t} if @var{OBJECT} is of the class @var{CLASS-NAME}.
address@hidden defun
+
address@hidden CLASS-NAME-child-p object
+Return @code{t} if @var{OBJECT} is of the class @var{CLASS-NAME},
+or is of a subclass of @var{CLASS-NAME}.
address@hidden defun
+
address@hidden eieio-error-unsupported-class-tags
+If non-nil, @code{defclass} signals an error if a tag in a slot
+specifier is unsupported.
+
+This option is here to support programs written with older versions of
address@hidden, which did not produce such errors.
address@hidden defvar
+
address@hidden
+* Inheritance::         How to specify parents classes
+* Slot Options::       How to specify features of a slot.
+* Class Options::      How to specify features for this class.
address@hidden menu
+
address@hidden Inheritance
address@hidden Inheritance
+
address@hidden is a basic feature of an object-oriented language.
+In @eieio{}, a defined class specifies the super classes from which it
+inherits by using the second argument to @code{defclass}.  Here is an
+example:
+
address@hidden
+(defclass my-baseclass ()
+   ((slot-A :initarg :slot-A)
+    (slot-B :initarg :slot-B))
+  "My Baseclass.")
address@hidden example
+
address@hidden
+To subclass from @code{my-baseclass}, we specify it in the superclass
+list:
+
address@hidden
+(defclass my-subclass (my-baseclass)
+   ((specific-slot-A :initarg specific-slot-A)
+    )
+   "My subclass of my-baseclass")
address@hidden example
+
address@hidden
+Instances of @code{my-subclass} will inherit @code{slot-A} and
address@hidden, in addition to having @code{specific-slot-A} from the
+declaration of @code{my-subclass}.
+
address@hidden also supports multiple inheritance.  Suppose we define a
+second baseclass, perhaps an ``interface'' class, like this:
+
address@hidden
+(defclass my-interface ()
+   ((interface-slot :initarg :interface-slot))
+   "An interface to special behavior."
+   :abstract t)
address@hidden example
+
address@hidden
+The interface class defines a special @code{interface-slot}, and also
+specifies itself as abstract.  Abstract classes cannot be
+instantiated.  It is not required to make interfaces abstract, but it
+is a good programming practice.
+
+We can now modify our definition of @code{my-subclass} to use this
+interface class, together with our original base class:
+
address@hidden
+(defclass my-subclass (my-baseclass my-interface)
+   ((specific-slot-A :initarg specific-slot-A)
+    )
+   "My subclass of my-baseclass")
address@hidden example
+
address@hidden
+With this, @code{my-subclass} also has @code{interface-slot}.
+
+If @code{my-baseclass} and @code{my-interface} had slots with the same
+name, then the superclass showing up in the list first defines the
+slot attributes.
+
+Inheritance in @eieio{} is more than just combining different slots.
+It is also important in method invocation.  @ref{Methods}.
+
+If a method is called on an instance of @code{my-subclass}, and that
+method only has an implementation on @code{my-baseclass}, or perhaps
address@hidden, then the implementation for the baseclass is
+called.
+
+If there is a method implementation for @code{my-subclass}, and
+another in @code{my-baseclass}, the implementation for
address@hidden can call up to the superclass as well.
+
address@hidden Slot Options
address@hidden Slot Options
+
+The @var{slot-list} argument to @code{defclass} is a list of elements
+where each element defines one slot.  Each slot is a list of the form
+
address@hidden
+  (SLOT-NAME :TAG1 ATTRIB-VALUE1
+             :TAG2 ATTRIB-VALUE2
+             :TAGN ATTRIB-VALUEN)
address@hidden example
+
address@hidden
+where @var{SLOT-NAME} is a symbol that will be used to refer to the
+slot.  @var{:TAG} is a symbol that describes a feature to be set
+on the slot.  @var{ATTRIB-VALUE} is a lisp expression that will be
+used for @var{:TAG}.
+
+Valid tags are:
+
address@hidden @code
address@hidden :initarg
+A symbol that can be used in the argument list of the constructor to
+specify a value for the new instance being created.
+
+A good symbol to use for initarg is one that starts with a colon @code{:}.
+
+The slot specified like this:
address@hidden
+  (myslot :initarg :myslot)
address@hidden example
+could then be initialized to the number 1 like this:
address@hidden
+  (myobject "name" :myslot 1)
address@hidden example
+
address@hidden New Objects}.
+
address@hidden :initform
+A expression used as the default value for this slot.
+
+If @code{:initform} is left out, that slot defaults to being unbound.
+It is an error to reference an unbound slot, so if you need
+slots to always be in a bound state, you should always use an
address@hidden:initform} specifier.
+
+Use @code{slot-boundp} to test if a slot is unbound
+(@pxref{Predicates}).  Use @code{slot-makeunbound} to set a slot to
+being unbound after giving it a value (@pxref{Accessing Slots}).
+
+The value passed to initform is automatically quoted.  Thus,
address@hidden
+:initform (1 2 3)
address@hidden example
+appears as the specified list in the default object.
+A symbol that is a function like this:
address@hidden
+:initform +
address@hidden example
+will set the initial value as that symbol.
+A function that is a lambda expression, like this:
address@hidden
+:initform (lambda () some-variablename)
address@hidden example
+
+will be evaluated at instantiation time to the value of
address@hidden
address@hidden This feature was more annoying than useful.  Use the
address@hidden `initialize-instance' function to do this.
address@hidden
address@hidden On the other hand, if you need code to be
address@hidden executed at instantiation time as the initform, code like this:
address@hidden @example
address@hidden :initform (lambda () (+ 1 some-global-var))
address@hidden @end example
address@hidden will be identified as a function call, and be executed in place.
+
address@hidden lambda-default
+
+
+Lastly, using the function @code{lambda-default} instead of
address@hidden will let you specify a lambda expression to use as the
+value, without evaluation, thus:
address@hidden
+:initform (lambda-default () some-variablename)
address@hidden example
address@hidden @@TODO - This will be deleted after fair warning.
+will not be evaluated at instantiation time, and the value in this
+slot will instead be @code{(lambda () some-variablename)}.
+
+After a class has been created with @code{defclass}, you can change
+that default value with @code{oset-default}. @ref{Accessing Slots}.
+
address@hidden :type
+An unquoted type specifier used to validate data set into this slot.
address@hidden(cl)Type Predicates}.
+Here are some examples:
+ @table @code
+ @item symbol
+ A symbol.
+ @item number
+ A number type
+ @item my-class-name
+ An object of your class type.
+ @item (or null symbol)
+ A symbol, or nil.
+ @item function
+ A function symbol, or a @code{lambda-default} expression.
+
+ @end table
+
address@hidden :allocation
+Either :class or :instance (defaults to :instance) used to
+specify how data is stored.  Slots stored per instance have unique
+values for each object.  Slots stored per class have shared values for
+each object.  If one object changes a :class allocated slot, then all
+objects for that class gain the new value.
+
address@hidden :documentation
+Documentation detailing the use of this slot.  This documentation is
+exposed when the user describes a class, and during customization of an
+object.
+
address@hidden :accessor
+Name of a generic function which can be used to fetch the value of this slot.
+You can call this function later on your object and retrieve the value
+of the slot.
+
+This options is in the CLOS spec, but is not fully compliant in @eieio{}.
+
address@hidden :writer
+Name of a generic function which will write this slot.
+
+This options is in the CLOS spec, but is not fully compliant in @eieio{}.
+
address@hidden :reader
+Name of a generic function which will read this slot.
+
+This options is in the CLOS spec, but is not fully compliant in @eieio{}.
+
address@hidden :custom
+A custom :type specifier used when editing an object of this type.
+See documentation for @code{defcustom} for details.  This specifier is
+equivalent to the :type spec of a @code{defcustom} call.
+
+This options is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :label
+When customizing an object, the value of :label will be used instead
+of the slot name.  This enables better descriptions of the data than
+would usually be afforded.
+
+This options is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :group
+Similar to @code{defcustom}'s :group command, this organizes different
+slots in an object into groups.  When customizing an object, only the
+slots belonging to a specific group need be worked with, simplifying the
+size of the display.
+
+This options is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :printer
+This routine takes a symbol which is a function name.  The function
+should accept one argument.  The a rgument is the value from the slot
+to be printed.  The function in @code{object-write} will write the
+slot value out to a printable form on @code{standard-output}.
+
+The output format MUST be  something that could in turn be interpreted
+with @code{read} such that the object can be brought back in from the
+output stream.  Thus, if you wanted to output a symbol, you would need
+to quote the symbol.  If you wanted to run a function on load, you
+can output the code to do the construction of the value.
+
address@hidden :protection
+When using a slot referencing function such as @code{slot-value}, and
+the value behind @var{slot} is private or protected, then the current
+scope of operation must be within a method of the calling object.
+
+Valid values are:
+
address@hidden @code
address@hidden :public
+Access this slot from any scope.
address@hidden :protected
+Access this slot only from methods of the same class or a child class.
address@hidden :private
+Access this slot only from methods of the same class.
address@hidden table
+
+This options is specific to Emacs, and is not in the CLOS spec.
+
address@hidden table
+
address@hidden Class Options
address@hidden Class Options
+
+In the @var{options-and-doc} arguments to @code{defclass}, the
+following class options may be specified:
+
address@hidden @code
address@hidden :documentation
+A documentation string for this class.
+
+If an Emacs-style documentation string is also provided, then this
+option is ignored.  An Emacs-style documentation string is not
+prefixed by the @code{:documentation} tag, and appears after the list
+of slots, and before the options.
+
address@hidden :allow-nil-initform
+If this option is non-nil, and the @code{:initform} is @code{nil}, but
+the @code{:type} is specifies something such as @code{string} then allow
+this to pass.  The default is to have this option be off.  This is
+implemented as an alternative to unbound slots.
+
+This options is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :abstract
+A class which is @code{:abstract} cannot be instantiated, and instead
+is used to define an interface which subclasses should implement.
+
+This option is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :custom-groups
+This is a list of groups that can be customized within this class.  This
+slot is auto-generated when a class is created and need not be
+specified.  It can be retrieved with the @code{class-option} command,
+however, to see what groups are available.
+
+This option is specific to Emacs, and is not in the CLOS spec.
+
address@hidden :method-invocation-order
+This controls the order in which method resolution occurs for
address@hidden:primary} methods in cases of multiple inheritance.  The order
+affects which method is called first in a tree, and if
address@hidden is used, it controls the order in which the
+stack of methods are run.
+
+Valid values are:
+
address@hidden @code
address@hidden :breadth-first
+Search for methods in the class hierarchy in breadth first order.
+This is the default.
address@hidden :depth-first
+Search for methods in the class hierarchy in a depth first order.
address@hidden table
+
address@hidden @xref{Method Invocation}, for more on method invocation order.
+
address@hidden :metaclass
+Unsupported CLOS option.  Enables the use of a different base class other
+than @code{standard-class}.
+
address@hidden :default-initargs
+Unsupported CLOS option.  Specifies a list of initargs to be used when
+creating new objects.  As far as I can tell, this duplicates the
+function of @code{:initform}.
address@hidden table
+
address@hidden compatibility}, for more details on CLOS tags versus
address@hidden tags.
+
address@hidden Making New Objects
address@hidden  node-name,  next,  previous,  up
address@hidden Making New Objects
+
+Suppose we have defined a simple class is defined, such as:
+
address@hidden
+(defclass record ()
+   ( ) "Doc String")
address@hidden example
+
address@hidden
+It is now possible to create objects of that class type.
+
+Calling @code{defclass} has defined two new functions.  One is the
+constructor @var{record}, and the other is the predicate,
address@hidden
+
address@hidden record object-name &rest slots
+
+This creates and returns a new object.  This object is not assigned to
+anything, and will be garbage collected if not saved.  This object
+will be given the string name @var{object-name}.  There can be
+multiple objects of the same name, but the name slot provides a handy
+way to keep track of your objects.  @var{slots} is just all the slots
+you wish to preset.  Any slot set as such @emph{will not} get its
+default value, and any side effects from a slot's @code{:initform}
+that may be a function will not occur.
+
+An example pair would appear simply as @code{:value 1}.  Of course you
+can do any valid Lispy thing you want with it, such as
address@hidden:value (if (boundp 'special-symbol) special-symbol nil)}
+
+Example of creating an object from a class:
+
address@hidden
+(record "test" :value 3 :reference nil)
address@hidden example
+
address@hidden defun
+
+To create an object from a class symbol, use use @code{make-instance}.
+
address@hidden make-instance class &rest initargs
address@hidden
+Make a new instance of @var{class} based on @var{initargs}.
address@hidden is a class symbol.  For example:
+
address@hidden
+  (make-instance 'foo)
address@hidden example
+
+  @var{initargs} is a property list with keywords based on the @code{:initarg}
+for each slot.  For example:
+
address@hidden
+  (make-instance @code{'foo} @code{:slot1} value1 @code{:slotN} valueN)
address@hidden example
+
+Compatability note:
+
+If the first element of @var{initargs} is a string, it is used as the
+name of the class.
+
+In @eieio{}, the class' constructor requires a name for use when printing.
address@hidden in CLOS doesn't use names the way Emacs does, so the
+class is used as the name slot instead when @var{initargs} doesn't start with
+a string.
address@hidden defun
+
address@hidden Accessing Slots
address@hidden  node-name,  next,  previous,  up
address@hidden Accessing Slots
+
+There are several ways to access slot values in an object.  The naming
+and argument-order conventions are similar to those used for
+referencing vectors (@pxref{Vectors,,,elisp,GNU Emacs Lisp Reference
+Manual}).
+
address@hidden oset object slot value
+This macro sets the value behind @var{slot} to @var{value} in
address@hidden  It returns @var{value}.
address@hidden defmac
+
address@hidden oset-default class slot value
+This macro sets the @code{:initform} for @var{slot} in @var{class} to
address@hidden
+
+This allows the user to set both public and private defaults after the
+class has been constructed, and provides a way to to configure the
+default behavior of packages built with classes (the same way
address@hidden does for buffer-local variables).
+
+For example, if a user wanted all @code{data-objects} (@pxref{Building
+Classes}) to inform a special object of his own devising when they
+changed, this can be arranged by simply executing this bit of code:
+
address@hidden
+(oset-default data-object reference (list my-special-object))
address@hidden example
address@hidden defmac
+
address@hidden oref obj slot
address@hidden
+Retrieve the value stored in @var{obj} in the slot named by @var{slot}.
+Slot is the name of the slot when created by @dfn{defclass} or the label
+created by the @code{:initarg} tag.
address@hidden defmac
+
address@hidden oref-default obj slot
address@hidden
+Gets the default value of @var{obj} (maybe a class) for @var{slot}.
+The default value is the value installed in a class with the @code{:initform}
+tag.  @var{slot} can be the slot name, or the tag specified by the 
@code{:initarg}
+tag in the @dfn{defclass} call.
address@hidden defmac
+
+The following accessors are defined by CLOS to reference or modify
+slot values, and use the previously mentioned set/ref routines.
+
address@hidden slot-value object slot
address@hidden
+This function retrieves the value of @var{slot} from @var{object}.
+Unlike @code{oref}, the symbol for @var{slot} must be quoted.
address@hidden defun
+
address@hidden set-slot-value object slot value
address@hidden
+This is not a CLOS function, but is meant to mirror @code{slot-value} if
+you don't want to use the cl package's @code{setf} function.  This
+function sets the value of @var{slot} from @var{object}.  Unlike
address@hidden, the symbol for @var{slot} must be quoted.
address@hidden defun
+
address@hidden slot-makeunbound object slot
+This function unbinds @var{slot} in @var{object}.  Referencing an
+unbound slot can signal an error.
address@hidden defun
+
address@hidden object-add-to-list object slot item &optional append
address@hidden
+In OBJECT's @var{slot}, add @var{item} to the list of elements.
+Optional argument @var{append} indicates we need to append to the list.
+If @var{item} already exists in the list in @var{slot}, then it is not added.
+Comparison is done with @dfn{equal} through the @dfn{member} function call.
+If @var{slot} is unbound, bind it to the list containing @var{item}.
address@hidden defun
+
address@hidden object-remove-from-list object slot item
address@hidden
+In OBJECT's @var{slot}, remove occurrences of @var{item}.
+Deletion is done with @dfn{delete}, which deletes by side effect
+and comparisons are done with @dfn{equal}.
+If @var{slot} is unbound, do nothing.
address@hidden defun
+
address@hidden with-slots spec-list object &rest body
address@hidden
+Bind @var{spec-list} lexically to slot values in @var{object}, and execute 
@var{body}.
+This establishes a lexical environment for referring to the slots in
+the instance named by the given slot-names as though they were
+variables.  Within such a context the value of the slot can be
+specified by using its slot name, as if it were a lexically bound
+variable.  Both setf and setq can be used to set the value of the
+slot.
+
address@hidden is of a form similar to @dfn{let}.  For example:
+
address@hidden
+  ((VAR1 SLOT1)
+    SLOT2
+    SLOTN
+   (VARN+1 SLOTN+1))
address@hidden example
+
+Where each @var{var} is the local variable given to the associated
address@hidden  A Slot specified without a variable name is given a
+variable name of the same name as the slot.
+
address@hidden
+(defclass myclass () (x :initarg 1))
+(setq mc (make-instance 'myclass))
+(with-slots (x) mc x)                      => 1
+(with-slots ((something x)) mc something)  => 1
address@hidden example
address@hidden defun
+
address@hidden Writing Methods
address@hidden  node-name,  next,  previous,  up
address@hidden Writing Methods
+
+Writing a method in @eieio{} is similar to writing a function.  The
+differences are that there are some extra options and there can be
+multiple definitions under the same function symbol.
+
+Where a method defines an implementation for a particular data type, a
address@hidden method} accepts any argument, but contains no code.  It
+is used to provide the dispatching to the defined methods.  A generic
+method has no body, and is merely a symbol upon which methods are
+attached.  It also provides the base documentation for what methods
+with that name do.
+
address@hidden
+* Generics::
+* Methods::
+* Static Methods::
address@hidden menu
+
address@hidden Generics
address@hidden Generics
+
+Each @eieio{} method has one corresponding generic.  This generic
+provides a function binding and the base documentation for the method
+symbol (@pxref{Symbol Components,,,elisp,GNU Emacs Lisp Reference
+Manual}).
+
address@hidden defgeneric method arglist [doc-string]
+This macro turns the (unquoted) symbol @var{method} into a function.
address@hidden is the default list of arguments to use (not implemented
+yet).  @var{doc-string} is the documentation used for this symbol.
+
+A generic function acts as a placeholder for methods.  There is no
+need to call @code{defgeneric} yourself, as @code{defmethod} will call
+it if necessary.  Currently the argument list is unused.
+
address@hidden signals an error if you attempt to turn an existing
+Emacs Lisp function into a generic function.
+
+You can also create a generic method with @code{defmethod}
+(@pxref{Methods}).  When a method is created and there is no generic
+method in place with that name, then a new generic will be created,
+and the new method will use it.
address@hidden defmac
+
+In CLOS, a generic call also be used to provide an argument list and
+dispatch precedence for all the arguments.  In @eieio{}, dispatching
+only occurs for the first argument, so the @var{arglist} is not used.
+
address@hidden Methods
address@hidden Methods
+
+A method is a function that is executed if the first argument passed
+to it matches the method's class.  Different @eieio{} classes may
+share the same method names.
+
+Methods are created with the @code{defmethod} macro, which is similar
+to @code{defun}.
+
address@hidden defmethod method [:before | :primary | :after | :static ] 
arglist [doc-string] forms
+
address@hidden is the name of the function to create.
+
address@hidden:before} and @code{:after} specify execution order (i.e., when
+this form is called).  If neither of these symbols are present, the
+default priority is used (before @code{:after} and after
address@hidden:before}); this default priority is represented in CLOS as
address@hidden:primary}.
+
address@hidden:} The @code{:BEFORE}, @code{:PRIMARY}, @code{:AFTER}, and
address@hidden:STATIC} method tags were in all capital letters in previous
+versions of @eieio{}.
+
address@hidden is the list of arguments to this method.  The first
+argument in this list---and @emph{only} the first argument---may have
+a type specifier (see the example below).  If no type specifier is
+supplied, the method applies to any object.
+
address@hidden is the documentation attached to the implementation.
+All method doc-strings are incorporated into the generic method's
+function documentation.
+
address@hidden is the body of the function.
+
address@hidden defmac
+
address@hidden
+In the following example, we create a method @code{mymethod} for the
address@hidden class:
+
address@hidden
+(defmethod mymethod ((obj classname) secondarg)
+  "Doc string" )
address@hidden example
+
address@hidden
+This method only executes if the @var{obj} argument passed to it is an
address@hidden object of class @code{classname}.
+
+A method with no type specifier is a @dfn{default method}.  If a given
+class has no implementation, then the default method is called when
+that method is used on a given object of that class.
+
+Only one default method per execution specifier (@code{:before},
address@hidden:primary}, or @code{:after}) is allowed.  If two
address@hidden appear with @var{arglist}s lacking a type specifier,
+and having the same execution specifier, then the first implementation
+is replaced.
+
+When a method is called on an object, but there is no method specified
+for that object, but there is a method specified for object's parent
+class, the parent class' method is called.  If there is a method
+defined for both, only the child's method is called.  A child method
+may call a parent's method using @code{call-next-method}, described
+below.
+
+If multiple methods and default methods are defined for the same
+method and class, they are executed in this order:
+
address@hidden
address@hidden method :before
address@hidden default :before
address@hidden method :primary
address@hidden default :primary
address@hidden method :after
address@hidden default :after
address@hidden enumerate
+
+If no methods exist, Emacs signals a @code{no-method-definition}
+error.  @xref{Signals}.
+
address@hidden call-next-method &rest replacement-args
address@hidden
+
+This function calls the superclass method from a subclass method.
+This is the ``next method'' specified in the current method list.
+
+If @var{replacement-args} is address@hidden, then use them instead of
address@hidden  At the top level, the generic
+argument list is passed in.
+
+Use @code{next-method-p} to find out if there is a next method to
+call.
address@hidden defun
+
address@hidden next-method-p
address@hidden
address@hidden if there is a next method.
+Returns a list of lambda expressions which is the @code{next-method}
+order.
address@hidden defun
+
+At present, @eieio{} does not implement all the features of CLOS:
+
address@hidden
address@hidden
+There is currently no @code{:around} tag.
address@hidden
+CLOS allows multiple sets of type-cast arguments, but @eieio{} only
+allows the first argument to be cast.
address@hidden enumerate
+
address@hidden Static Methods
address@hidden Static Methods
+
+Static methods do not depend on an object instance, but instead
+operate on an object's class.  You can create a static method by using
+the @code{:static} key with @code{defmethod}.
+
+Do not treat the first argument of a @code{:static} method as an
+object unless you test it first.  Use the functions
address@hidden or @code{oset-default} which will work on a class,
+or on the class of an object.
+
+A Class' @code{constructor} method is defined as a @code{:static}
+method.
+
address@hidden:} The @code{:static} keyword is unique to @eieio{}.
+
address@hidden TODO - Write some more about static methods here
+
address@hidden @node Method Invocation
address@hidden @chapter Method Invocation
+
address@hidden TODO - writeme
+
address@hidden Predicates
address@hidden  node-name,  next,  previous,  up
address@hidden Predicates and Utilities
+
+Now that we know how to create classes, access slots, and define
+methods, it might be useful to verify that everything is doing ok.  To
+help with this a plethora of predicates have been created.
+
address@hidden find-class symbol &optional errorp
address@hidden
+Return the class that @var{symbol} represents.
+If there is no class, @code{nil} is returned if @var{errorp} is @code{nil}.
+If @var{errorp} is address@hidden, @code{wrong-argument-type} is signaled.
address@hidden defun
+
address@hidden class-p class
address@hidden
+Return @code{t} if @var{class} is a valid class vector.
address@hidden is a symbol.
address@hidden defun
+
address@hidden slot-exists-p object-or-class slot
address@hidden
address@hidden if @var{object-or-class} has @var{slot}.
address@hidden defun
+
address@hidden slot-boundp object slot
address@hidden
address@hidden if OBJECT's @var{slot} is bound.
+Setting a slot's value makes it bound.  Calling @dfn{slot-makeunbound} will
+make a slot unbound.
address@hidden can be an instance or a class.
address@hidden defun
+
address@hidden class-name class
+Return a string of the form @samp{#<class myclassname>} which should look
+similar to other Lisp objects like buffers and processes.  Printing a
+class results only in a symbol.
address@hidden defun
+
address@hidden class-option class option
+Return the value in @var{CLASS} of a given @var{OPTION}.
+For example:
+
address@hidden
+(class-option eieio-default-superclass :documentation)
address@hidden example
+
+Will fetch the documentation string for @code{eieio-default-superclass}.
address@hidden defun
+
address@hidden class-constructor class
+Return a symbol used as a constructor for @var{class}.  The
+constructor is a function used to create new instances of
address@hidden This function provides a way to make an object of a class
+without knowing what it is.  This is not a part of CLOS.
address@hidden defun
+
address@hidden object-name obj
+Return a string of the form @samp{#<object-class myobjname>} for @var{obj}.
+This should look like Lisp symbols from other parts of emacs such as
+buffers and processes, and is shorter and cleaner than printing the
+object's vector.  It is more useful to use @code{object-print} to get
+and object's print form, as this allows the object to add extra display
+information into the symbol.
address@hidden defun
+
address@hidden object-class obj
+Returns the class symbol from @var{obj}.
address@hidden defun
+
address@hidden class-of obj
+CLOS symbol which does the same thing as @code{object-class}
address@hidden defun
+
address@hidden object-class-fast obj
+Same as @code{object-class} except this is a macro, and no
+type-checking is performed.
address@hidden defun
+
address@hidden object-class-name obj
+Returns the symbol of @var{obj}'s class.
address@hidden defun
+
address@hidden class-parents class
+Returns the direct parents class of @var{class}.  Returns @code{nil} if
+it is a superclass.
address@hidden defun
+
address@hidden class-parents-fast class
+Just like @code{class-parent} except it is a macro and no type checking
+is performed.
address@hidden defun
+
address@hidden class-parent class
+Deprecated function which returns the first parent of @var{class}.
address@hidden defun
+
address@hidden class-children class
+Return the list of classes inheriting from @var{class}.
address@hidden defun
+
address@hidden class-children-fast class
+Just like @code{class-children}, but with no checks.
address@hidden defun
+
address@hidden same-class-p obj class
+Returns @code{t} if @var{obj}'s class is the same as @var{class}.
address@hidden defun
+
address@hidden same-class-fast-p obj class
+Same as @code{same-class-p} except this is a macro and no type checking
+is performed.
address@hidden defun
+
address@hidden object-of-class-p obj class
+Returns @code{t} if @var{obj} inherits anything from @var{class}.  This
+is different from @code{same-class-p} because it checks for inheritance.
address@hidden defun
+
address@hidden child-of-class-p child class
+Returns @code{t} if @var{child} is a subclass of @var{class}.
address@hidden defun
+
address@hidden generic-p method-symbol
+Returns @code{t} if @code{method-symbol} is a generic function, as
+opposed to a regular Emacs Lisp function.
address@hidden defun
+
address@hidden Association Lists
address@hidden Association Lists
+
+Lisp offers the concept of association lists, with primitives such as
address@hidden used to access them.  The following functions can be used
+to manage association lists of @eieio{} objects:
+
address@hidden object-assoc key slot list
address@hidden
+Return an object if @var{key} is @dfn{equal} to SLOT's value of an object in 
@var{list}.
address@hidden is a list of objects who's slots are searched.
+Objects in @var{list} do not need to have a slot named @var{slot}, nor does
address@hidden need to be bound.  If these errors occur, those objects will
+be ignored.
address@hidden defun
+
+
address@hidden object-assoc-list slot list
+Return an association list generated by extracting @var{slot} from all
+objects in @var{list}.  For each element of @var{list} the @code{car} is
+the value of @var{slot}, and the @code{cdr} is the object it was
+extracted from.  This is useful for generating completion tables.
address@hidden defun
+
address@hidden eieio-build-class-alist &optional base-class
+Returns an alist of all currently defined classes.  This alist is
+suitable for completion lists used by interactive functions to select a
+class.  The optional argument @var{base-class} allows the programmer to
+select only a subset of classes which includes @var{base-class} and
+all its subclasses.
address@hidden defun
+
address@hidden Customizing
address@hidden node-name, next, previous, up
address@hidden Customizing Objects
+
address@hidden supports the Custom facility through two new widget types.
+If a variable is declared as type @code{object}, then full editing of
+slots via the widgets is made possible.  This should be used
+carefully, however, because modified objects are cloned, so if there
+are other references to these objects, they will no longer be linked
+together.
+
+If you want in place editing of objects, use the following methods:
+
address@hidden eieio-customize-object object
+Create a custom buffer and insert a widget for editing @var{object}.  At
+the end, an @code{Apply} and @code{Reset} button are available.  This
+will edit the object "in place" so references to it are also changed.
+There is no effort to prevent multiple edits of a singular object, so
+care must be taken by the user of this function.
address@hidden defun
+
address@hidden eieio-custom-widget-insert object flags
+This method inserts an edit object into the current buffer in place.
+It is implemented as @code{(widget-create 'object-edit :value object)}.
+This method is provided as a locale for adding tracking, or
+specializing the widget insert procedure for any object.
address@hidden defun
+
+To define a slot with an object in it, use the @code{object} tag.  This
+widget type will be automatically converted to @code{object-edit} if you
+do in place editing of you object.
+
+If you want to have additional actions taken when a user clicks on the
address@hidden button, then overload the method @code{eieio-done-customizing}.
+This method does nothing by default, but that may change in the future.
+This would be the best way to make your objects persistent when using
+in-place editing.
+
address@hidden Widget extention
+
+When widgets are being created, one new widget extention has been added,
+called the @code{:slotofchoices}.  When this occurs in a widget
+definition, all elements after it are removed, and the slot is specifies
+is queried and converted into a series of constants.
+
address@hidden
+(choice (const :tag "None" nil)
+        :slotofchoices morestuff)
address@hidden example
+
+and if the slot @code{morestuff} contains @code{(sym1 sym2 sym3)}, the
+above example is converted into:
+
address@hidden
+(choice (const :tag "None" nil)
+        (const sym1)
+        (const sym2)
+        (const sym3))
address@hidden example
+
+This is useful when a given item needs to be selected from a list of
+items defined in this second slot.
+
address@hidden Introspection
address@hidden Introspection
+
+Introspection permits a programmer to peek at the contents of a class
+without any previous knowledge of that class.  While @eieio{} implements
+objects on top of vectors, and thus everything is technically visible,
+some functions have been provided.  None of these functions are a part
+of CLOS.
+
address@hidden object-slots obj
+Return the list of public slots for @var{obj}.
address@hidden defun
+
address@hidden class-slot-initarg class slot
+For the given @var{class} return the :initarg associated with
address@hidden  Not all slots have initargs, so the return value can be
+nil.
address@hidden defun
+
address@hidden Base Classes
address@hidden  node-name,  next,  previous,  up
address@hidden Base Classes
+
+All defined classes, if created with no specified parent class,
+inherit from a special class called @code{eieio-default-superclass}.
address@hidden Superclass}.
+
+Often, it is more convenient to inherit from one of the other base
+classes provided by @eieio{}, which have useful pre-defined
+properties.  (Since @eieio{} supports multiple inheritance, you can
+even inherit from more than one of these classes at once.)
+
address@hidden
+* eieio-instance-inheritor::    Enable value inheritance between instances.
+* eieio-instance-tracker::      Enable self tracking instances.
+* eieio-singleton::             Only one instance of a given class.
+* eieio-persistent::            Enable persistence for a class.
+* eieio-named::                 Use the object name as a :name slot.
+* eieio-speedbar::              Enable speedbar support in your objects.
address@hidden menu
+
address@hidden eieio-instance-inheritor
address@hidden  node-name,  next,  previous,  up
address@hidden @code{eieio-instance-inheritor}
+
+This class is defined in the package @file{eieio-base}.
+
+Instance inheritance is a mechanism whereby the value of a slot in
+object instance can reference the parent instance.  If the parent's slot
+value is changed, then the child instance is also changed.  If the
+child's slot is set, then the parent's slot is not modified.
+
address@hidden {Class} eieio-instance-inheritor parent-instance
+A class whose instances are enabled with instance inheritance.
+The @var{parent-instance} slot indicates the instance which is
+considered the parent of the current instance.  Default is @code{nil}.
address@hidden deftp
+
address@hidden clone
+To use this class, inherit from it with your own class.
+To make a new instance that inherits from and existing instance of your
+class, use the @code{clone} method with additional parameters
+to specify local values.
+
address@hidden slot-unbound
+The @code{eieio-instance-inheritor} class works by causing cloned
+objects to have all slots unbound.  This class' @code{slot-unbound}
+method will cause references to unbound slots to be redirected to the
+parent instance.  If the parent slot is also unbound, then
address@hidden will signal an an error named @code{slot-unbound}.
+
address@hidden eieio-instance-tracker
address@hidden @code{eieio-instance-tracker}
+
+This class is defined in the package @file{eieio-base}.
+
+Sometimes it is useful to keep a master list of all instances of a given
+class.  The class @code{eieio-instance-tracker} performs this task.
+
address@hidden {Class} eieio-instance-tracker tracker-symbol
+Enable instance tracking for this class.
+The slot @var{tracker-symbol} should be initialized in inheritors of
+this class to a symbol created with @code{defvar}.  This symbol will
+serve as the variable used as a master list of all objects of the given
+class.
address@hidden deftp
+
address@hidden eieio-instance-tracker initialize-instance obj slot
+This method is defined as an @code{:after} method.
+It adds new instances to the master list.  Do not overload this method
+unless you use @code{call-next-method.}
address@hidden defmethod
+
address@hidden eieio-instance-tracker delete-instance obj
+Remove @var{obj} from the master list of instances of this class.
+This may let the garbage collector nab this instance.
address@hidden defmethod
+
address@hidden eieio-instance-tracker-find key slot list-symbol
+This convenience function lets you find instances.  @var{key} is the
+value to search for.  @var{slot} is the slot to compare @var{KEY}
+against.  The function @code{equal} is used for comparison.
+The paramter @var{list-symbol} is the variable symbol which contains the
+list of objects to be searched.
address@hidden deffn
+
address@hidden eieio-singleton
address@hidden  node-name,  next,  previous,  up
address@hidden @code{eieio-singleton}
+
+This class is defined in the package @file{eieio-base}.
+
address@hidden {Class} eieio-singleton
+Inheriting from the singleton class will guarantee that there will
+only ever be one instance of this class.  Multiple calls to
address@hidden will always return the same object.
address@hidden deftp
+
address@hidden eieio-persistent
address@hidden  node-name,  next,  previous,  up
address@hidden @code{eieio-persistent}
+
+This class is defined in the package @file{eieio-base}.
+
+If you want an object, or set of objects to be persistent, meaning the
+slot values are important to keep saved between sessions, then you will
+want your top level object to inherit from @code{eieio-persistent}.
+
+To make sure your persistent object can be moved, make sure all file
+names stored to disk are made relative with
address@hidden
+
address@hidden {Class} eieio-persistent file file-header-line
+Enables persistence for instances of this class.
+Slot @var{file} with initarg @code{:file} is the file name in which this
+object will be saved.
+Class allocated slot @var{file-header-line} is used with method
address@hidden as a header comment.
address@hidden deftp
+
+All objects can write themselves to a file, but persistent objects have
+several additional methods that aid in maintaining them.
+
address@hidden eieio-persistent eieio-persistent-save obj &optional file
+Write the object @var{obj} to its file.
+If optional argument @var{file} is specified, use that file name
+instead.
address@hidden defmethod
+
address@hidden eieio-persistent eieio-persistent-path-relative obj file
+Return a file name derived from @var{file} which is relative to the
+stored location of @var{OBJ}.  This method should be used to convert
+file names so that they are relative to the save file, making any system
+of files movable from one location to another.
address@hidden defmethod
+
address@hidden eieio-persistent object-write obj &optional comment
+Like @code{object-write} for @code{standard-object}, but will derive
+a header line comment from the class allocated slot if one is not
+provided.
address@hidden defmethod
+
address@hidden eieio-persistent-read filename
+Read @var{filename} which contains an @code{eieio-persistent} object
+previously written with @code{eieio-persistent-save}.
address@hidden defun
+
address@hidden eieio-named
address@hidden  node-name,  next,  previous,  up
address@hidden @code{eieio-named}
+
+This class is defined in the package @file{eieio-base}.
+
address@hidden {Class} eieio-named
+Object with a name.
+Name storage already occurs in an object.  This object provides get/set
+access to it.
address@hidden deftp
+
address@hidden eieio-speedbar
address@hidden  node-name,  next,  previous,  up
address@hidden @code{eieio-speedbar}
+
+This class is in package @file{eieio-speedbar}.
+
+If a series of class instances map to a tree structure, it is possible
+to cause your classes to be displayable in Speedbar. @xref{Top,,,speedbar}.
+Inheriting from these classes will enable a speedbar major display mode
+with a minimum of effort.
+
address@hidden {Class} eieio-speedbar buttontype buttonface
+Enables base speedbar display for a class.
address@hidden speedbar-make-tag-line
+The slot @var{buttontype} is any of the symbols allowed by the
+function @code{speedbar-make-tag-line} for the @var{exp-button-type}
+argument @xref{Extending,,,speedbar}.
+The slot @var{buttonface} is the face to use for the text of the string
+displayed in speedbar.
+The slots @var{buttontype} and @var{buttonface} are class allocated
+slots, and do not take up space in your instances.
address@hidden deftp
+
address@hidden {Class} eieio-speedbar-directory-button buttontype buttonface
+This class inherits from @code{eieio-speedbar} and initializes
address@hidden and @var{buttonface} to appear as directory level lines.
address@hidden deftp
+
address@hidden {Class} eieio-speedbar-file-button buttontype buttonface
+This class inherits from @code{eieio-speedbar} and initializes
address@hidden and @var{buttonface} to appear as file level lines.
address@hidden deftp
+
+To use these classes, inherit from one of them in you class.  You can
+use multiple inheritance with them safely.  To customize your class for
+speedbar display, override the default values for @var{buttontype} and
address@hidden to get the desired effects.
+
+Useful methods to define for your new class include:
+
address@hidden eieio-speedbar eieio-speedbar-derive-line-path obj depth
+Return a string representing a directory associated with an instance
+of @var{obj}.  @var{depth} can be used to indice how many levels of
+indentation have been opened by the user where @var{obj} is shown.
address@hidden defmethod
+
+
address@hidden eieio-speedbar eieio-speedbar-description obj
+Return a string description of @var{OBJ}.
+This is shown in the minibuffer or tooltip when the mouse hovers over
+this instance in speedbar.
address@hidden defmethod
+
address@hidden eieio-speedbar eieio-speedbar-child-description obj
+Return a string representing a description of a child node of @var{obj}
+when that child is not an object.  It is often useful to just use
+item info helper functions such as @code{speedbar-item-info-file-helper}.
address@hidden defmethod
+
address@hidden eieio-speedbar eieio-speedbar-object-buttonname obj
+Return a string which is the text displayed in speedbar for @var{obj}.
address@hidden defmethod
+
address@hidden eieio-speedbar eieio-speedbar-object-children obj
+Return a list of children of @var{obj}.
address@hidden defmethod
+
address@hidden eieio-speedbar eieio-speedbar-child-make-tag-lines obj depth
+This method inserts a list of speedbar tag lines for @var{obj} to
+represent its children.  Implement this method for your class
+if your children are not objects themselves.  You still need to
+implement @code{eieio-speedbar-object-children}.
+
+In this method, use techniques specified in the Speedbar manual.
address@hidden,,,speedbar}.
address@hidden defmethod
+
+Some other functions you will need to learn to use are:
+
address@hidden eieio-speedbar-create make-map key-map menu name toplevelfn
+Register your object display mode with speedbar.
address@hidden is a function which initialized you keymap.
address@hidden is a symbol you keymap is installed into.
address@hidden is an easy menu vector representing menu items specific to your
+object display.
address@hidden is a short string to use as a name identifying you mode.
address@hidden is a function called which must return a list of
+objects representing those in the instance system you wish to browse in
+speedbar.
+
+Read the Extending chapter in the speedbar manual for more information
+on how speedbar modes work
address@hidden,,,speedbar}.
address@hidden deffn
+
address@hidden Browsing
address@hidden  node-name,  next,  previous,  up
address@hidden Browsing class trees
+
+The command @kbd{M-x eieio-browse} displays a buffer listing all the
+currently loaded classes in emacs.  The classes are listed in an
+indented tree structure, starting from @code{eieio-default-superclass}
+(@pxref{Default Superclass}).
+
+With a prefix argument, this command prompts for a class name; it then
+lists only that class and its subclasses.
+
+Here is a sample tree from our current example:
+
address@hidden
+eieio-default-superclass
+  +--data-object
+       +--data-object-symbol
address@hidden example
+
+Note: new classes are consed into the inheritance lists, so the tree
+comes out upside-down.
+
address@hidden Class Values
address@hidden  node-name,  next,  previous,  up
address@hidden Class Values
+
+Details about any class or object can be retrieved using the function
address@hidden function.  Interactively, type in the name of
+a class.  In a program, pass it a string with the name of a class, a
+class symbol, or an object.  The resulting buffer will display all slot
+names.
+
+Additionally, all methods defined to have functionality on this class is
+displayed.
+
address@hidden Default Superclass
address@hidden  node-name,  next,  previous,  up
address@hidden Default Superclass
+
+All defined classes, if created with no specified parent class) will
+inherit from a special class stored in
address@hidden  This superclass is quite simple, but
+with it, certain default methods or attributes can be added to all
+objects.  In CLOS, this would be named @code{STANDARD-CLASS}, and that
+symbol is an alias to @code{eieio-default-superclass}.
address@hidden
+
+Currently, the default superclass is defined as follows:
+
address@hidden
+(defclass eieio-default-superclass nil
+  nil
+  "Default parent class for classes with no specified parent class.
+Its slots are automatically adopted by classes with no specified
+parents.  This class is not stored in the `parent' slot of a class vector."
+  :abstract t)
address@hidden example
+
+The default superclass implements several methods providing a default
+behavior for all objects created by @eieio{}.
+
address@hidden
+* Initialization::      How objects are initialized
+* Basic Methods::       Clone, print, and write
+* Signal Handling::     Methods for managing signals.
address@hidden menu
+
address@hidden Initialization
address@hidden Initialization
+
+When creating an object of any type, you can use its constructor, or
address@hidden  This, in turns calls the method
address@hidden, which then calls the method
address@hidden
+
+These methods are all implemented on the default superclass so you do
+not need to write them yourself, unless you need to override one of
+their behaviors.
+
+Users should not need to call @code{initialize-instance} or
address@hidden, as these are used by @code{make-instance} to
+initialize the object.  They are instead provided so that users can
+augment these behaviors.
+
address@hidden initialize-instance obj &rest slots
+Initialize @var{obj}.  Sets slots of @var{obj} with @var{slots} which
+is a list of name/value pairs.  These are actually just passed to
address@hidden
address@hidden defun
+
address@hidden shared-initialize obj &rest slots
+Sets slots of @var{obj} with @var{slots} which is a list of name/value
+pairs.
+
+This is called from the default @code{constructor}.
address@hidden defun
+
address@hidden Basic Methods
address@hidden Basic Methods
+
+Additional useful methods defined on the base sublcass are:
+
address@hidden clone obj &rest params
address@hidden
+Make a copy of @var{obj}, and then apply @var{params}.
address@hidden is a parameter list of the same form as @var{initialize-instance}
+which are applied to change the object.  When overloading @dfn{clone}, be
+sure to call @dfn{call-next-method} first and modify the returned object.
address@hidden defun
+
address@hidden object-print this &rest strings
address@hidden
+Pretty printer for object @var{this}.  Call function @dfn{object-name} with 
@var{strings}.
+The default method for printing object @var{this} is to use the
+function @dfn{object-name}.
+
+It is sometimes useful to put a summary of the object into the
+default #<notation> string when using eieio browsing tools.
+
+Implement this function and specify @var{strings} in a call to
address@hidden to provide additional summary information.
+When passing in extra strings from child classes, always remember
+to prepend a space.
+
address@hidden
+(defclass data-object ()
+   (value)
+   "Object containing one data slot.")
+
+(defmethod object-print ((this data-object) &optional strings)
+  "Return a string with a summary of the data object as part of the name."
+  (apply 'call-next-method this
+         (cons (format " value: %s" (render this)) strings)))
address@hidden example
+
+here is what some output could look like:
address@hidden
+(object-print test-object)
+   => #<data-object test-object value: 3>
address@hidden example
address@hidden defun
+
address@hidden object-write obj &optional comment
+Write @var{obj} onto a stream in a readable fashion.  The resulting
+output will be Lisp code which can be used with @code{read} and
address@hidden to recover the object.  Only slots with @code{:initarg}s
+are written to the stream.
address@hidden defun
+
address@hidden Signal Handling
address@hidden Signal Handling
+
+The default superclass defines methods for managing error conditions.
+These methods all throw a signal for a particular error condition.
+
+By implementing one of these methods for a class, you can change the
+behavior that occurs during one of these error cases, or even ignore
+the error by providing some behavior.
+
address@hidden slot-missing ab &rest foo
address@hidden
+Method invoked when an attempt to access a slot in @var{object} fails.
address@hidden is the name of the failed slot, @var{operation} is the type of 
access
+that was requested, and optional @var{new-value} is the value that was desired
+to be set.
+
+This method is called from @code{oref}, @code{oset}, and other functions which
+directly reference slots in EIEIO objects.
+
+The default method signals an error of type @code{invalid-slot-name}.
address@hidden
+
+You may override this behavior, but it is not expected to return in the
+current implementation.
+
+This function takes arguments in a different order than in CLOS.
address@hidden defun
+
address@hidden slot-unbound object class slot-name fn
address@hidden
+Slot unbound is invoked during an attempt to reference an unbound slot.
address@hidden is the instance of the object being reference.  @var{class} is 
the
+class of @var{object}, and @var{slot-name} is the offending slot.  This 
function
+throws the signal @code{unbound-slot}.  You can overload this function and
+return the value to use in place of the unbound value.
+Argument @var{fn} is the function signaling this error.
+Use @dfn{slot-boundp} to determine if a slot is bound or not.
+
+In @var{clos}, the argument list is (@var{class} @var{object} 
@var{slot-name}), but
address@hidden can only dispatch on the first argument, so the first two are 
swapped.
address@hidden defun
+
address@hidden no-applicable-method object method &rest args
address@hidden
+Called if there are no implementations for @var{object} in @var{method}.
address@hidden is the object which has no method implementation.
address@hidden are the arguments that were passed to @var{method}.
+
+Implement this for a class to block this signal.  The return
+value becomes the return value of the original method call.
address@hidden defun
+
address@hidden no-next-method object &rest args
address@hidden
+Called from @dfn{call-next-method} when no additional methods are available.
address@hidden is othe object being called on @dfn{call-next-method}.
address@hidden are the  arguments it is called by.
+This method signals @dfn{no-next-method} by default.  Override this
+method to not throw an error, and it's return value becomes the
+return value of @dfn{call-next-method}.
address@hidden defun
+
address@hidden Signals
address@hidden  node-name,  next,  previous,  up
address@hidden Signals
+
+There are new condition names (signals) that can be caught when using
address@hidden
+
address@hidden Signal invalid-slot-name obj-or-class slot
+This signal is called when an attempt to reference a slot in an
address@hidden is made, and the @var{slot} is not defined for
+it.
address@hidden deffn
+
address@hidden Signal no-method-definition method arguments
+This signal is called when @var{method} is called, with @var{arguments}
+and nothing is resolved.  This occurs when @var{method} has been
+defined, but the arguments make it impossible for @eieio{} to determine
+which method body to run.
+
+To prevent this signal from occurring in your class, implement the
+method @code{no-applicable-method} for your class.  This method is
+called when to throw this signal, so implementing this for your class
+allows you block the signal, and perform some work.
address@hidden deffn
+
address@hidden Signal no-next-method class arguments
+This signal is called if the function @code{call-next-method} is called
+and there is no next method to be called.
+
+Overload the method @code{no-next-method} to protect against this signal.
address@hidden deffn
+
address@hidden Signal invalid-slot-type slot spec value
+This signal is called when an attempt to set @var{slot} is made, and
address@hidden doesn't match the specified type @var{spec}.
+
+In @eieio{}, this is also used if a slot specifier has an invalid value
+during a @code{defclass}.
address@hidden deffn
+
address@hidden Signal unbound-slot object class slot
+This signal is called when an attempt to reference @var{slot} in
address@hidden is made, and that instance is currently unbound.
address@hidden deffn
+
address@hidden Naming Conventions
address@hidden  node-name,  next,  previous,  up
address@hidden Naming Conventions
+
address@hidden,,,elisp,GNU Emacs Lisp Reference Manual}, for a
+description of Emacs Lisp programming conventions.  These conventions
+help ensure that Emacs packages work nicely one another, so an
address@hidden program should follow them.  Here are some conventions
+that apply specifically to @eieio{}-based programs:
+
address@hidden
+
address@hidden Come up with a package prefix that is relatively short.  Prefix
+all classes, and methods with your prefix.  This is a standard
+convention for functions and variables in Emacs.
+
address@hidden Do not prefix method names with the class name.  All methods in
address@hidden are ``virtual'', and are dynamically dispatched.  Anyone can
+override your methods at any time.  Your methods should be prefixed
+with your package name.
+
address@hidden Do not prefix slots in your class.  The slots are always locally
+scoped to your class, and need no prefixing.
+
address@hidden If your library inherits from other libraries of classes, you
+must ``require'' that library with the @code{require} command.
+
address@hidden itemize
+
address@hidden CLOS compatibility
address@hidden  node-name,  next,  previous,  up
address@hidden CLOS compatibility
+
+Currently, the following functions should behave almost as expected from
+CLOS.
+
address@hidden @code
+
address@hidden defclass
+All slot keywords are available but not all work correctly.
+Slot keyword differences are:
+
address@hidden @asis
+
address@hidden :reader, and :writer tags
+Create methods that signal errors instead of creating an unqualified
+method.  You can still create new ones to do its business.
+
address@hidden :accessor
+This should create an unqualified method to access a slot, but
+instead pre-builds a method that gets the slot's value.
+
address@hidden :type
+Specifier uses the @code{typep} function from the @file{cl}
+package.  @xref{(cl)Type Predicates}. It therefore has the same issues as
+that package.  Extensions include the ability to provide object names.
address@hidden table
+
+Defclass also supports class options, but does not currently use values
+of @code{:metaclass}, and @code{:default-initargs}.
+
address@hidden make-instance
+Make instance works as expected, however it just uses the @eieio{} instance
+creator automatically generated when a new class is created.
address@hidden New Objects}.
+
address@hidden defgeneric
+Creates the desired symbol, and accepts all of the expected arguments
+except @code{:around}.
+
address@hidden defmethod
+Calls defgeneric, and accepts most of the expected arguments.  Only
+the first argument to the created method may have a type specifier.
+To type cast against a class, the class must exist before defmethod is
+called. In addition, the @code{:around} tag is not supported.
+
address@hidden call-next-method
+Inside a method, calls the next available method up the inheritance tree
+for the given object.  This is different than that found in CLOS because
+in @eieio{} this function accepts replacement arguments.  This permits
+subclasses to modify arguments as they are passed up the tree.  If no
+arguments are given, the expected CLOS behavior is used.
address@hidden setf
+If the common-lisp subsystem is loaded, the setf parameters are also
+loaded so the form @code{(setf (slot-value object slot) t)} should
+work.
address@hidden table
+
+CLOS supports the @code{describe} command, but @eieio{} only provides
address@hidden, and @code{eieio-describe-generic}.  These
+functions are adviced into @code{describe-variable}, and
address@hidden
+
+When creating a new class (@pxref{Building Classes}) there are several
+new keywords supported by @eieio{}.
+
+In @eieio{} tags are in lower case, not mixed case.
+
address@hidden Wish List
address@hidden Wish List
+
address@hidden is an incomplete implementation of CLOS.  Finding ways to
+improve the compatability would help make CLOS style programs run
+better in Emacs.
+
+Some important compatability features that would be good to add are:
+
address@hidden
address@hidden
address@hidden:around} method key.
+
address@hidden
+Method dispatch for built-in types.
address@hidden
+Method dispatch for multiple argument typing.
address@hidden
+Improve integration with the @file{cl} package.
address@hidden enumerate
+
+There are also improvements to be made to allow @eieio{} to operate
+better in the Emacs environment.
+
address@hidden
address@hidden
+Allow subclasing of Emacs built-in types, such as faces, markers, and
+buffers.
address@hidden
+Allow method overloading of method-like functions in Emacs.
address@hidden enumerate
+
address@hidden Function Index
address@hidden Function Index
+
address@hidden fn
+
address@hidden
address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]