Ace::Object - Manipulate Ace Data Objects
# open database connection and get an object
use Ace;
$db = Ace->connect(-host => 'beta.crbm.cnrs-mop.fr',
-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
$sequence->replace('Visible.Overlap_Right',$r,'M55555');
$sequence->add('Visible.Homology','GR91198');
$sequence->delete('Source.Clone','MBR122');
$sequence->commit();
# Rollback changes
$sequence->rollback()
# 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 database.
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
|
Laboratory->FF
|
Address->Mail->CRBM duCNRS
| | |
| | BP 5051
| | |
| | 34033 Montpellier
| | |
| | FRANCE
| |
| E_mail->[email protected]
| |
| 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 above.
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.
$object = new Ace::Object($class,$name,$database);
$object = new Ace::Object(-class=>$class,
-name=>$name,
-db=>database);
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 = $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 = $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
programmatically 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 = $object->db();
Return the database that the object is associated with.
$bool = $object->isClass();
Returns true if the object is a class (can be fetched from the database).
$bool = $object->isTag();
Returns true if the object is a tag.
@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.
$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.
$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 in:
$s=$db->fetch('Sequence','M4');
@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:
$object->at('tag1[index1].tag2[index2].tag3[index3]...');
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',
'[email protected],'33-67-613324','33-67-521559')
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().
$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',
'[email protected],'33-67-613324','33-67-521559')
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 object:
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
K10E5
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 subtag.
$locus = $object->get('Positive'=>'Positive_locus',1);
This is a deprecated synonym for
get().
$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 contents.
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 of:
$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.
$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');
@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
fetch().
Deprecated method. This has the same semantics as
fetch(), which should
be used instead.
@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:
$object->at('Address[2]');
$object->get('Address',2);
$object->Address(2);
Use whatever syntax is most comfortable for you.
In a scalar context,
col() returns the number of items in
the column.
@row=$object->row();
@row=$object->row($position);
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.
$object->asString;
asString() returns a pretty-printed ASCII representation of the object
tree.
$object->asTable;
asTable() returns the object as a tab-delimited text table.
$object->asAce;
asAce() returns the object as a tab-delimited text table in
".ace" format.
$object->asHTML;
$object->asHTML(\&tree_traversal_code);
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;
}
$object->asHTML(\&process_cell);
$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.
($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 map.
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.
$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.
$result_code = $object->add_row($tag=>$value);
$result_code = $object->add_row($tag=>[list,of,values]);
$result_code = $object->add(-path=>$tag,
-value=>$value);
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.
$object->add_row('Address.Pager'=>'555-1212');
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');
$lab->add_row('City','Cincinatti');
$lab->add_row('Country','USA');
$author = new Ace::Object('Author','Smith J',$db);
$author->add_row('Full_name','Joseph M. Smith');
$author->add_row('Laboratory',$lab);
$lab->commit();
$author->commit();
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 inserted.
Here is an example of copying the "Assembly_tags" subtree from one
database object to another:
$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->add_tree('Assembly_tags'=>$tags);
$AC3copy->commit || warn $AC3copy->error;
Notice that this syntax will not work the way you think it should:
$AC3copy->add_tree('Assembly_tags'=>$ac3->at('Assembly_tags'));
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->add_tree('Assembly_tags'=>$assembly);
$newObj->commit || warn $newObj->error;
$result_code = $object->delete($tag_path,$value);
$result_code = $object->delete(-path=>$tag_path,
-value=>$value);
Delete the indicated tag and value from the object. This example deletes the
address line "FRANCE" from the Author's mailing address:
$object->delete('Address.Mail','FRANCE');
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.
$result_code = $object->replace($tag_path,$oldvalue,$newvalue);
$result_code = $object->replace(-path=>$tag_path,
-old=>$oldvalue,
-new=>$newvalue);
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:
$object->delete('Address.Mail','FRANCE','LANGUEDOC');
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 identified.
$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.
$object->rollback;
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, or 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.
$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.
$object->date_style('ace');
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
$object->db->date_style('ace');
Note that the text representation of the date will change for all objects
returned from this database, not just the current one.
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 = $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.
$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 = $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 = $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 error.
WARNING - THIS IS DEFUNCT AND NO LONGER WORKS. USE THE Ace->
class()
METHOD INSTEAD
$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.
$object->debug(1);
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 global.
Ace, Ace::Model, Ace::Object, Ace::Local, Ace::Sequence,Ace::Sequence::Multi
Lincoln Stein <
[email protected]> with extensive help from Jean Thierry-Mieg
<
[email protected]>
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.