Why not adopt me?
NAME
Object::Dependency - maintain a dependency graph
SYNOPSIS
use Object::Dependency;
my $graph = Object::Dependency->new()
$graph->add($object, @objects_the_first_object_depends_upon)
$graph->remove_dependency(@objects_that_are_no_longer_relevant)
@objects_without_dependencies = $graph->independent;
DESCRIPTION
This module maintains a simple dependency graph. Items can be add
ed more than once to note additional depenencies. Dependency relationships cannot be removed except by removing objects entirely.
We do not currently check for cycles so please be careful!
Items are expected to be objects, but do not have to be. Objects are identified by their refadd() so if you combine objects and other scalers, there is some chance of a collision between large intetgers and the refaddr(). The undef
value will cause warnings.
CONSTRUCTION
Construction is easy: no parameters are expected.
METHODS
- add($object, @depends_upon_objects)
-
Adds an item (
$object
) to the dependency graph and notes which items it depends upon. The same object may be added multiple times so if you want to declare what object depends upon an object, just useadd
in reverse multiple times.The @depends_upon_objects are the prerequisites for $object. $object is blocked by its @depends_upon_objects.
- remove_all_dependencies(@objects)
-
Removes the
@objects
from the dependency graph. All objects dependent on@objects
will also be removed. - remove_dependency(@objects)
-
Removes the
@objects
from the dependency graph. Dependencies upon these objects will be considered to be satisfied. Objects that had been dependent upon@objects
will no longer be dependent upon them. - stuck_dependency($object, $description_of_problem)
-
Mark that the
$object
will never be removed from the dependency graph because there is some problem with it. All objects that depend upon$object
will now be considered "stuck". Behavior of removing a stuck dependency is not defined. - independent(%opts)
-
Returns a list of objects that do not depend upon other objects. Mark the returned objects as active and locked.
Options are:
- count => COUNT
-
Return at most COUNT items.
- active => 1
-
Normally active objects are included in the returned list. With
active => 1
, active objects are not returned. Yes, this is backwards. Sorry. - lock => 1
-
Locked objects are not included in the returned list. With
lock => 1
, objects are locked when they are returned. - stuck => 1
-
Normally items that have been marked as "stuck" are not returned. With
stuck => 1
, stuck objects are returned. Stuck objects are not indpendent of the rest of the graph. This capability is simply to provide a way to find out what is stuck. Withstuck => 1
, normal independent objects are not returned -- only stuck ones are returned.
If the graph is not empty but there are no independent objects then there is a loop in the graph and
independent()
will die. Wrap it in aneval()
if you care. - alldone()
-
Returns true if there are no non-stuck objects in the dependency graph.
- desc($object, $description)
-
Sets the description of the object (if
$description
is defined).Returns the description of the object, annotated by it's dependency graph status: LOCKED, INDEPENDENT, ACTIVE, or STUCK.
Special handling is done for Proc::JobQueue::Job and Proc::JobQueue::DependencyTask objects.
- dump_graph / dump_graph_string
-
Prints/returns the dependency graph (described objects with the dependencies).
- is_dependency($object)
-
Returns true if
$object
is in the dependency graph.
SEE ALSO
Proc::JobQueue::DependencyQueue
LICENSE
Copyright (C) 2007-2008 SearchMe, Inc. Copyright (C) 2009-2010 David Muir Sharnoff Copyright (C) 2011-2014 Google, Inc. This package may be used and redistributed under the terms of either the Artistic 2.0 or LGPL 2.1 license.