Provided by: libace-perl_1.92-4_amd64 bug


       Ace::Object - Manipulate  Ace Data Objects


           # open database connection and get an object
           use Ace;
           $db = Ace->connect(-host => '',
                              -port => 20000100);
           $sequence  = $db->fetch(Sequence => 'D12345');

           # Inspect the object
           $r    = $sequence->at('Visible.Overlap_Right');
           @row  = $sequence->row;
           @col  = $sequence->col;
           @tags = $sequence->tags;

           # Explore object substructure
           @more_tags = $sequence->at('Visible')->tags;
           @col       = $sequence->at("Visible.$more_tags[1]")->col;

           # Follow a pointer into database
           $r     = $sequence->at('Visible.Overlap_Right')->fetch;
           $next  = $r->at('Visible.Overlap_left')->fetch;

           # Classy way to do the same thing
           $r     = $sequence->Overlap_right;
           $next  = $sequence->Overlap_left;

           # Pretty-print object
           print $sequence->asString;
           print $sequence->asTabs;
           print $sequence->asHTML;

           # Update object

           # Rollback changes

           # Get errors
           print $sequence->error;


       Ace::Object is the base class for objects returned from ACEDB databases. Currently there
       is only one type of Ace::Object, but this may change in the future to support more
       interesting object-specific behaviors.

       Using the Ace::Object interface, you can explore the internal structure of an Ace::Object,
       retrieve its content, and convert it into various types of text representation.  You can
       also fetch a representation of any object as a GIF image.

       If you have write access to the databases, add new data to an object, replace existing
       data, or kill it entirely.  You can also create a new object de novo and write it into the

       For information on connecting to ACEDB databases and querying them, see Ace.


       The structure of an Ace::Object is very similar to that of an Acedb object.  It is a tree
       structure like this one (an Author object):

        Thierry-Mieg J->Full_name ->Jean Thierry-Mieg
                        Address->Mail->CRBM duCNRS
                         |        |     |
                         |        |    BP 5051
                         |        |     |
                         |        |    34033 Montpellier
                         |        |     |
                         |        |    FRANCE
                         |        |
                         |       E_mail->
                         |        |
                         |       Phone ->33-67-613324
                         |        |
                         |       Fax   ->33-67-521559
                        Paper->The C. elegans sequencing project
                               Genome Project Database
                               Genome Sequencing
                                How to get ACEDB for your Sun
                               ACEDB is Hungry

       Each object in the tree has two pointers, a "right" pointer to the node on its right, and
       a "down" pointer to the node beneath it.  Right pointers are used to store hierarchical
       relationships, such as Address->Mail->E_mail, while down pointers are used to store lists,
       such as the multiple papers written by the Author.

       Each node in the tree has a type and a name.  Types include integers, strings, text,
       floating point numbers, as well as specialized biological types, such as "dna" and
       "peptide."  Another fundamental type is "tag," which is a text identifier used to label
       portions of the tree.  Examples of tags include "Paper" and "Laboratory" in the example

       In addition to these built-in types, there are constructed types known as classes.  These
       types are specified by the data model.  In the above example, "Thierry-Mieg J" is an
       object of the "Author" class, and "Genome Project Database" is an object of the "Paper"
       class.  An interesting feature of objects is that you can follow them into the database,
       retrieving further information.  For example, after retrieving the "Genome Project
       Database" Paper from the Author object, you could fetch more information about it, either
       by following its right pointer, or by using one of the specialized navigation routines
       described below.

   new() method
           $object = new Ace::Object($class,$name,$database);
           $object = new Ace::Object(-class=>$class,

       You can create a new Ace::Object from scratch by calling the new() routine with the
       object's class, its identifier and a handle to the database to create it in.  The object
       won't actually be created in the database until you add() one or more tags to it and
       commit() it (see below).  If you do not provide a database handle, the object will be
       created in memory only.

       Arguments can be passed positionally, or as named parameters, as shown above.

       This routine is usually used internally.  See also add_row(), add_tree(), delete() and
       replace() for ways to manipulate this object.

   name() method
           $name = $object->name();

       Return the name of the Ace::Object.  This happens automatically whenever you use the
       object in a context that requires a string or a number.  For example:

           $object = $db->fetch(Author,"Thierry-Mieg J");
           print "$object did not write 'Pride and Prejudice.'\n";

   class() method
           $class = $object->class();

       Return the class of the object.  The return value may be one of "float," "int," "date,"
       "tag," "txt," "dna," "peptide," and "scalar."  (The last is used internally by Perl to
       represent objects created programatically prior to committing them to the database.)  The
       class may also be a user-constructed type such as Sequence, Clone or Author.  These user-
       constructed types usually have an initial capital letter.

   db() method
            $db = $object->db();

       Return the database that the object is associated with.

   isClass() method
            $bool = $object->isClass();

       Returns true if the object is a class (can be fetched from the database).

   isTag() method
            $bool = $object->isTag();

       Returns true if the object is a tag.

   tags() method
            @tags = $object->tags();

       Return all the top-level tags in the object as a list.  In the Author example above, the
       returned list would be ('Full_name','Laboratory','Address','Paper').

       You can fetch tags more deeply nested in the structure by navigating inwards using the
       methods listed below.

   right() and down() methods
            $subtree = $object->right;
            $subtree = $object->right($position);
            $subtree = $object->down;
            $subtree = $object->down($position);

       right() and down() provide a low-level way of traversing the tree structure by following
       the tree's right and down pointers.  Called without any arguments, these two methods will
       move one step.  Called with a numeric argument >= 0 they will move the indicated number of
       steps (zero indicates no movement).

            $full_name = $object->right->right;
            $full_name = $object->right(2);

            $city = $object->right->down->down->right->right->down->down;
            $city = $object->right->down(2)->right(2)->down(2);

       If $object contains the "Thierry-Mieg J" Author object, then the first series of accesses
       shown above retrieves the string "Jean Thierry-Mieg" and the second retrieves "34033
       Montpellier."  If the right or bottom pointers are NULL, these methods will return undef.

       In addition to being somewhat awkard, you will probably never need to use these methods.
       A simpler way to retrieve the same information would be to use the at() method described
       in the next section.

       The right() and down() methods always walk through the tree of the current object.  They
       do not follow object pointers into the database.  Use fetch() (or the deprecated pick() or
       follow() methods) instead.

   at() method
           $subtree    = $object->at($tag_path);
           @values     = $object->at($tag_path);

       at() is a simple way to fetch the portion of the tree that you are interested in.  It
       takes a single argument, a simple tag or a path.  A simple tag, such as "Full_name", must
       correspond to a tag in the column immediately to the right of the root of the tree.  A
       path such as "Address.Mail" is a dot-delimited path to the subtree.  Some examples are
       given below.

           ($full_name)   = $object->at('Full_name');
           @address_lines = $object->at('Address.Mail');

       The second line above is equivalent to:

           @address = $object->at('Address')->at('Mail');

       Called without a tag name, at() just dereferences the object, returning whatever is to the
       right of it, the same as $object->right

       If a path component already has a dot in it, you may escape the dot with a backslash, as

           @homologies = $s->at('Homol.DNA_homol.yk192f7\.3';

       This also demonstrates that path components don't necessarily have to be tags, although in
       practice they usually are.

       at() returns slightly different results depending on the context in which it is called.
       In a list context, it returns the column of values to the right of the tag.  However, in a
       scalar context, it returns the subtree rooted at the tag.  To appreciate the difference,
       consider these two cases:

           $name1   = $object->at('Full_name');
           ($name2) = $object->at('Full_name');

       After these two statements run, $name1 will be the tag object named "Full_name", and
       $name2 will be the text object "Jean Thierry-Mieg", The relationship between the two is
       that $name1->right leads to $name2.  This is a powerful and useful construct, but it can
       be a trap for the unwary.  If this behavior drives you crazy, use this construct:

           $name1   = $object->at('Full_name')->at();

       For finer control over navigation, path components can include optional indexes to
       indicate navigation to the right of the current path component.  Here is the syntax:


       Indexes are zero-based.  An index of [0] indicates no movement relative to the current
       component, and is the same as not using an index at all.  An index of [1] navigates one
       step to the right, [2] moves two steps to the right, and so on.  Using the Thierry-Mieg
       object as an example again, here are the results of various indexes:

           $object = $db->fetch(Author,"Thierry-Mieg J");
           $a = $object->at('Address[0]')   --> "Address"
           $a = $object->at('Address[1]')   --> "Mail"
           $a = $object->at('Address[2]')   --> "CRBM duCNRS"

       In an array context, the last index in the path does something very interesting.  It
       returns the entire column of data K steps to the right of the path, where K is the index.
       This is used to implement so-called "tag[2]" syntax, and is very useful in some
       circumstances.  For example, here is a fragment of code to return the Thierry-Mieg
       object's full address without having to refer to each of the intervening "Mail", "E_Mail"
       and "Phone" tags explicitly.

          @address = $object->at('Address[2]');
          --> ('CRBM duCNRS','BP 5051','34033 Montpellier','FRANCE',

       Similarly, "tag[3]" will return the column of data three hops to the right of the tag.
       "tag[1]" is identical to "tag" (with no index), and will return the column of data to the
       immediate right.  There is no special behavior associated with using "tag[0]" in an array
       context; it will always return the subtree rooted at the indicated tag.

       Internal indices such as "Homol[2].BLASTN", do not have special behavior in an array
       context.  They are always treated as if they were called in a scalar context.

       Also see col() and get().

   get() method
           $subtree    = $object->get($tag);
           @values     = $object->get($tag);
           @values     = $object->get($tag, $position);
           @values     = $object->get($tag => $subtag, $position);

       The get() method will perform a breadth-first search through the object (columns first,
       followed by rows) for the tag indicated by the argument, returning the column of the
       portion of the subtree it points to.  For example, this code fragment will return the
       value of the "Fax" tag.

           ($fax_no) = $object->get('Fax');
                --> "33-67-521559"

       The list versus scalar context semantics are the same as in at(), so if you want to
       retrieve the scalar value pointed to by the indicated tag, either use a list context as
       shown in the example, above, or a dereference, as in:

            $fax_no = $object->get('Fax');
                --> "Fax"
            $fax_no = $object->get('Fax')->at;
                --> "33-67-521559"

       An optional second argument to get(), $position, allows you to navigate the tree relative
       to the retrieved subtree.  Like the at() navigational indexes, $position must be a number
       greater than or equal to zero.  In a scalar context, $position moves rightward through the
       tree.  In an array context, $position implements "tag[2]" semantics.

       For example:

            $fax_no = $object->get('Fax',0);
                 --> "Fax"

            $fax_no = $object->get('Fax',1);
                 --> "33-67-521559"

            $fax_no = $object->get('Fax',2);
                 --> undef  # nothing beyond the fax number

            @address = $object->get('Address',2);
                 --> ('CRBM duCNRS','BP 5051','34033 Montpellier','FRANCE',

       It is important to note that get() only traverses tags.  It will not traverse nodes that
       aren't tags, such as strings, integers or objects.  This is in keeping with the behavior
       of the Ace query language "show" command.

       This restriction can lead to confusing results.  For example, consider the following

        Clone: B0280  Position    Map            Sequence-III  Ends   Left   3569
                                                                      Right  3585
                                  Pmap           ctg377        -1040  -1024
                      Positive    Positive_locus nhr-10
                      Sequence    B0280
                      Location    RW
                      FingerPrint Gel_Number     0
                                  Canonical_for  T20H1
                                  Bands          1354          18

       The following attempt to fetch the left and right positions of the clone will fail,
       because the search for the "Left" and "Right" tags cannot traverse "Sequence-III", which
       is an object, not a tag:

         my $left = $clone->get('Left');    # will NOT work
         my $right = $clone->get('Right');  # neither will this one

       You must explicitly step over the non-tag node in order to make this query work.  This
       syntax will work:

         my $left = $clone->get('Map',1)->get('Left');   # works
         my $left = $clone->get('Map',1)->get('Right');  # works

       Or you might prefer to use the tag[2] syntax here:

         my($left,$right) = $clone->get('Map',1)->at('Ends[2]');

       Although not frequently used, there is a form of get() which allows you to stack subtags:

           $locus = $object->get('Positive'=>'Positive_locus');

       Only on subtag is allowed.  You can follow this by a position if wish to offset from the

           $locus = $object->get('Positive'=>'Positive_locus',1);

   search() method
       This is a deprecated synonym for get().

   Autogenerated Access Methods
            $scalar = $object->Name_of_tag;
            $scalar = $object->Name_of_tag($position);
            @array  = $object->Name_of_tag;
            @array  = $object->Name_of_tag($position);
            @array  = $object->Name_of_tag($subtag=>$position);
            @array  = $object->Name_of_tag(-fill=>$tag);

       The module attempts to autogenerate data access methods as needed.  For example, if you
       refer to a method named "Fax" (which doesn't correspond to any of the built-in methods),
       then the code will call the get() method to find a tag named "Fax" and return its

       Unlike get(), this method will always step into objects.  This means that:

          $map = $clone->Map;

       will return the Sequence_Map object pointed to by the Clone's Map tag and not simply a
       pointer to a portion of the Clone tree.  Therefore autogenerated methods are functionally
       equivalent to the following:

          $map = $clone->get('Map')->fetch;

       The scalar context semantics are also slightly different.  In a scalar context, the
       autogenerated function will *always* move one step to the right.

       The list context semantics are identical to get().  If you want to dereference all members
       of a multivalued tag, you have to do so manually:

         @papers = $author->Paper;
         foreach (@papers) {
           my $paper = $_->fetch;
           print  $paper->asString;

       You can provide an optional positional index to rapidly navigate through the tree or to
       obtain tag[2] behavior.  In the following examples, the first two return the object's Fax
       number, and the third returns all data two hops to the right of Address.

            $object   = $db->fetch(Author => 'Thierry-Mieg J');
            ($fax_no) = $object->Fax;
            $fax_no   = $object->Fax(1);
            @address  = $object->Address(2);

       You may also position at a subtag, using this syntax:

            $representative = $object->Laboratory('Representative');

       Both named tags and positions can be combined as follows:

            $lab_address = $object->Laboratory(Address=>2);

       If you provide a -fill=>$tag argument, then the object fetch will automatically fill the
       specified subtree, greatly improving performance.  For example:

             $lab_address = $object->Laboratory(-filled=>'Address');

       ** NOTE: In a scalar context, if the node to the right of the tag is ** an object, the
       method will perform an implicit dereference of the ** object.  For example, in the case

           $lab = $author->Laboratory;

       **NOTE: The object returned is the dereferenced Laboratory object, not a node in the
       Author object.  You can control this by giving the autogenerated method a numeric offset,
       such as Laboratory(0) or Laboratory(1).  For backwards compatibility, Laboratory('@') is
       equivalent to Laboratory(1).

       The semantics of the autogenerated methods have changed subtly between version 1.57 (the
       last stable release) and version 1.62.  In earlier versions, calling an autogenerated
       method in a scalar context returned the subtree rooted at the tag.  In the current
       version, an implicit right() and dereference is performed.

   fetch() method
           $new_object = $object->fetch;
           $new_object = $object->fetch($tag);

       Follow object into the database, returning a new object.  This is the best way to follow
       object references.  For example:

           $laboratory = $object->at('Laboratory')->fetch;
           print $laboratory->asString;

       Because the previous example is a frequent idiom, the optional $tag argument allows you to
       combine the two operations into a single one:

           $laboratory = $object->fetch('Laboratory');

   follow() method
           @papers        = $object->follow('Paper');
           @filled_papers = $object->follow(-tag=>'Paper',-filled=>1);
           @filled_papers = $object->follow(-tag=>'Paper',-filled=>'Author');

       The follow() method will follow a tag into the database, dereferencing the column to its
       right and returning the objects resulting from this operation.  Beware!  If you follow a
       tag that points to an object, such as the Author "Paper" tag, you will get a list of all
       the Paper objects.  If you follow a tag that points to a scalar, such as "Full_name", you
       will get an empty string.  In a scalar context, this method will return the number of
       objects that would have been followed.

       The full named-argument form of this call accepts the arguments -tag (mandatory) and
       -filled (optional).  The former points to the tag to follow.  The latter accepts a boolean
       argument or the name of a subtag.  A numeric true argument will return completely "filled"
       objects, increasing network and memory usage, but possibly boosting performance if you
       have a high database access latency.  Alternatively, you may provide the name of a tag to
       follow, in which case just the named portion of the subtree in the followed objects will
       be filled (v.g.)

       For backward compatibility, if follow() is called without any arguments, it will act like

   pick() method
       Deprecated method.  This has the same semantics as fetch(), which should be used instead.

   col() method
            @column = $object->col;
            @column = $object->col($position);

       col() flattens a portion of the tree by returning the column one hop to the right of the
       current subtree. You can provide an additional positional index to navigate through the
       tree using "tag[2]" behavior.  This example returns the author's mailing address:

         @mailing_address = $object->at('Address.Mail')->col();

       This example returns the author's entire address including mail, e-mail and phone:

         @address = $object->at('Address')->col(2);

       It is equivalent to any of these calls:


       Use whatever syntax is most comfortable for you.

       In a scalar context, col() returns the number of items in the column.

   row() method

       row() will return the row of data to the right of the object.  The first member of the
       list will be the object itself.  In the case of the "Thierry-Mieg J" object, the example
       below will return the list ('Address','Mail','CRBM duCNRS').

            @row = $object->Address->row();

       You can provide an optional position to move rightward one or more places before
       retrieving the row.  This code fragment will return ('Mail','CRBM duCNRS'):

            @row = $object->Address->row(1);

       In a scalar context, row() returns the number of items in the row.

   asString() method

       asString() returns a pretty-printed ASCII representation of the object tree.

   asTable() method

       asTable() returns the object as a tab-delimited text table.

   asAce() method

       asAce() returns the object as a tab-delimited text table in ".ace" format.

   asHTML() method

       asHTML() returns an HTML 3 table representing the object, suitable for incorporation into
       a Web browser page.  The callback routine, if provided, will have a chance to modify the
       object representation before it is incorporated into the table, for example by turning it
       into an HREF link.  The callback takes a single argument containing the object, and must
       return a string-valued result.  It may also return a list as its result, in which case the
       first member of the list is the string representation of the object, and the second member
       is a boolean indicating whether to prune the table at this level.  For example, you can
       prune large repetitive lists.

       Here's a complete example:

          sub process_cell {
            my $obj = shift;
            return "$obj" unless $obj->isObject || $obj->isTag;

            my @col = $obj->col;
            my $cnt = scalar(@col);
            return ("$obj -- $cnt members",1);  # prune
                   if $cnt > 10                 # if subtree to big

            # tags are bold
            return "<B>$obj</B>" if $obj->isTag;

            # objects are blue
            return qq{<FONT COLOR="blue">$obj</FONT>} if $obj->isObject;


   asXML() method
          $result = $object->asXML;

       asXML() returns a well-formed XML representation of the object.  The particular
       representation is still under discussion, so this feature is primarily for demonstration.

   asGIF() method
         ($gif,$boxes) = $object->asGIF();
         ($gif,$boxes) = $object->asGIF(-clicks=>[[$x1,$y1],[$x2,$y2]...]
                                        -dimensions=> [$width,$height],
                                        -coords    => [$top,$bottom],
                                        -display   => $display_type,
                                        -view      => $view_type,
                                        -getcoords => $true_or_false

       asGIF() returns the object as a GIF image.  The contents of the GIF will be whatever xace
       would ordinarily display in graphics mode, and will vary for different object classes.

       You can optionally provide asGIF with a -clicks argument to simulate the action of a user
       clicking on the image.  The click coordinates should be formatted as an array reference
       that contains a series of two-element subarrays, each corresponding to the X and Y
       coordinates of a single mouse click.  There is currently no way to pass information about
       middle or right mouse clicks, dragging operations, or keystrokes.  You may also specify a
       -dimensions to control the width and height of the returned GIF.  Since there is no way of
       obtaining the preferred size of the image in advance, this is not usually useful.

       The optional -display argument allows you to specify an alternate display for the object.
       For example, Clones can be displayed either with the PMAP display or with the TREE
       display.  If not specified, the default display is used.

       The optional -view argument allows you to specify an alternative view for MAP objects
       only.  If not specified, you'll get the default view.

       The option -coords argument allows you to provide the top and bottom of the display for
       MAP objects only.  These coordinates are in the map's native coordinate system (cM, bp).
       By default, AceDB will show most (but not necessarily all) of the map according to xace's
       display rules.  If you call this method with the -getcoords argument and a true value, it
       will return a two-element array containing the coordinates of the top and bottom of the

       asGIF() returns a two-element array.  The first element is the GIF data.  The second
       element is an array reference that indicates special areas of the image called "boxes."
       Boxes are rectangular areas that surround buttons, and certain displayed objects.  Using
       the contents of the boxes array, you can turn the GIF image into a client-side image map.
       Unfortunately, not everything that is clickable is represented as a box.  You still have
       to pass clicks on unknown image areas back to the server for processing.

       Each box in the array is a hash reference containing the following keys:

           'coordinates'  => [$left,$top,$right,$bottom]
           'class'        => object class or "BUTTON"
           'name'         => object name, if any
           'comment'      => a text comment of some sort

       coordinates points to an array of points indicating the top-left and bottom-right corners
       of the rectangle.  class indicates the class of the object this rectangle surrounds.  It
       may be a database object, or the special word "BUTTON" for one of the display action
       buttons.  name indicates the name of the object or the button.  comment is some piece of
       information about the object in question.  You can display it in the status bar of the
       browser or in a popup window if your browser provides that facility.

   asDNA() and asPeptide() methods
           $dna = $object->asDNA();
           $peptide = $object->asPeptide();

       If you are dealing with a sequence object of some sort, these methods will return strings
       corresponding to the DNA or peptide sequence in FASTA format.

   add_row() method
           $result_code = $object->add_row($tag=>$value);
           $result_code = $object->add_row($tag=>[list,of,values]);
           $result_code = $object->add(-path=>$tag,

       add_row() updates the tree by adding data to the indicated tag path.  The example given
       below adds the value "555-1212" to a new Address entry named "Pager".  You may call
       add_row() a second time to add a new value under this tag, creating multi-valued entries.


       You may provide a list of values to add an entire row of data.  For example:

        $sequence->add_row('Assembly_tags'=>['Finished Left',38949,38952,'AC3']);

       Actually, the array reference is not entirely necessary, and if you prefer you can use
       this more concise notation:

        $sequence->add_row('Assembly_tags','Finished Left',38949,38952,'AC3');

       No check is done against the database model for the correct data type or tag path.  The
       update isn't actually performed until you call commit(), at which time a result code
       indicates whether the database update was successful.

       You may create objects that reference other objects this way:

           $lab = new Ace::Object('Laboratory','LM',$db);
           $lab->add_row('Full_name','The Laboratory of Medicine');

           $author = new Ace::Object('Author','Smith J',$db);
           $author->add_row('Full_name','Joseph M. Smith');


       The result code indicates whether the addition was syntactically correct.  add_row() will
       fail if you attempt to add a duplicate entry (that is, one with exactly the same tag and
       value).  In this case, use replace() instead.  Currently there is no checking for an
       attempt to add multiple values to a single-valued (UNIQUE) tag.  The error will be
       detected and reported at commit() time however.

       The add() method is an alias for add_row().

       See also the Ace->new() method.

         $result_code = $object->add_tree($tag=>$ace_object);
         $result_code = $object->add_tree(-tag=>$tag,-tree=>$ace_object);

       The add_tree() method will insert an entire Ace subtree into the object to the right of
       the indicated tag.  This can be used to build up complex Ace objects, or to copy portions
       of objects from one database to another.  The first argument is a tag path, and the second
       is the tree that you wish to insert.  As with add_row() the database will only be updated
       when you call commit().

       When inserting a subtree, you must be careful to remember that everything to the *right*
       of the node that you are pointing at will be inserted; not the node itself.  For example,
       given this Sequence object:

         Sequence AC3
           DB_info     Database    EMBL
           Assembly_tags   Finished Left   1   4   AC3
                           Clone left end      1   4   AC3
                           Clone right end     5512    5515    K07C5
                                               38949   38952   AC3
                           Finished Right      38949   38952   AC3

       If we use at('Assembly_tags') to fetch the subtree rooted on the "Assembly_tags" tag, it
       is the tree to the right of this tag, beginning with "Finished Left", that will be

       Here is an example of copying the "Assembly_tags" subtree from one database object to

        $remote = Ace->connect(-port=>200005)  || die "can't connect";
        $ac3 = $remote->fetch(Sequence=>'AC3') || die "can't get AC7";
        my $assembly = $ac3->at('Assembly_tags');

        $local = Ace->connect(-path=>'~acedb') || die "can't connect";
        $AC3copy = Ace::Object->new(Sequence=>'AC3copy',$local);
        $AC3copy->commit || warn $AC3copy->error;

       Notice that this syntax will not work the way you think it should:


       This is because call at() in an array context returns the column to the right of the tag,
       not the tag itself.

       Here's an example of building up a complex structure from scratch using a combination of
       add() and add_tree():

        $newObj = Ace::Object->new(Sequence=>'A555',$local);
        my $assembly = Ace::Object->new(tag=>'Assembly_tags');
        $assembly->add('Finished Left'=>[10,20,'ABC']);
        $assembly->add('Clone right end'=>[1000,2000,'DEF']);
        $assembly->add('Clone right end'=>[8000,9876,'FRED']);
        $assembly->add('Finished Right'=>[1000,3000,'ETHEL']);
        $newObj->commit || warn $newObj->error;

   delete() method
           $result_code = $object->delete($tag_path,$value);
           $result_code = $object->delete(-path=>$tag_path,

       Delete the indicated tag and value from the object.  This example deletes the address line
       "FRANCE" from the Author's mailing address:


       No actual database deletion occurs until you call commit().  The delete() result code
       indicates whether the deletion was successful.  Currently it is always true, since the
       database model is not checked.

   replace() method
           $result_code = $object->replace($tag_path,$oldvalue,$newvalue);
           $result_code = $object->replace(-path=>$tag_path,

       Replaces the indicated tag and value with the new value.  This example changes the address
       line "FRANCE" to "LANGUEDOC" in the Author's mailing address:


       No actual database changes occur until you call commit().  The delete() result code
       indicates whether the replace was successful.  Currently is true if the old value was

   commit() method
            $result_code = $object->commit;

       Commits all add(), replace() and delete() operations to the database.  It can also be used
       to write a completely new object into the database.  The result code indicates whether the
       object was successfully written.  If an error occurred, further details can be found in
       the Ace->error() error string.

   rollback() method

       Discard all adds, deletions and replacements, returning the object to the state it was in
       prior to the last commit().

       rollback() works by deleting the object from Perl memory and fetching the object anew from
       AceDB.  If someone has changed the object in the database while you were working with it,
       you will see this version, ot the one you originally fetched.

       If you are creating an entirely new object, you must add at least one tag in order to
       enter the object into the database.

   kill() method
           $result_code = $object->kill;

       This will remove the object from the database immediately and completely.  It does not
       wait for a commit(), and does not respond to a rollback().  If successful, you will be
       left with an empty object that contains just the class and object names.  Use with care!

       In the case of failure, which commonly happens when the database is not open for writing,
       this method will return undef.  A description of the problem can be found by calling the
       error() method.

   date_style() method

       This is a convenience method that can be used to set the date format for all objects
       returned by the database.  It is exactly equivalent to


       Note that the text representation of the date will change for all objects returned from
       this database, not just the current one.

   isRoot() method
           print "Top level object" if $object->isRoot;

       This method will return true if the object is a "top level" object, that is the root of an
       object tree rather than a subtree.

   model() method
           $model = $object->model;

       This method will return the object's model as an Ace::Model object, or undef if the object
       does not have a model. See Ace::Model for details.

   timestamp() method
          $stamp = $object->timestamp;

       The timestamp() method will retrieve the modification time and date from the object.  This
       works both with top level objects and with subtrees.  Timestamp handling must be turned on
       in the database, or timestamp() will return undef.

       The returned timestamp is actually a UserSession object which can be printed and explored
       like any other object.  However, there is currently no useful information in UserSession
       other than its name.

   comment() method
          $comment = $object->comment;

       This returns the comment attached to an object or object subtree, if any.  Comments are
       Comment objects and have the interesting property that a single comment can refer to
       multiple objects.  If there is no comment attached to the current subtree, this method
       will return undef.

       Currently you cannot create a new comment in AcePerl or edit an old one.

   error() method
           $error = $object->error;

       Returns the error from the previous operation, if any.  As in Ace::error(), this string
       will only have meaning if the previous operation returned a result code indicating an

   factory() method

           $package = $object->factory;

       When a root Ace object instantiates its tree of tags and values, it creates a hierarchical
       structure of Ace::Object objects.  The factory() method determines what class to bless
       these subsidiary objects into.  By default, they are Ace::Object objects, but you can
       override this method in a child class in order to create more specialized Ace::Object
       classes.  The method should return a string corresponding to the package to bless the
       object into.  It receives the current Ace::Object as its first argument.

   debug() method

       Change the debugging mode.  A zero turns off debugging messages.  Integer values produce
       debug messages on standard error.  Higher integers produce progressively more verbose
       messages.  This actually is just a front end to Ace->debug(), so the debugging level is


       Ace, Ace::Model, Ace::Object, Ace::Local, Ace::Sequence,Ace::Sequence::Multi


       Lincoln Stein <> with extensive help from Jean Thierry-Mieg

       Copyright (c) 1997-1998, Lincoln D. Stein

       This library is free software; you can redistribute it and/or modify it under the same
       terms as Perl itself.  See DISCLAIMER.txt for disclaimers of warranty.