NAME

Data::Sofu::Map - A Sofu Map

DESCRIPTION

Provides a interface similar to the original SofuD (sofu.sf.net)

Synopsis

require Data::Sofu::Map;
my $map = Data::Sofu::Map->new();
$map->setAttribute("foo","bar");
print $map->value("foo")->toString();
$tree = Data::Sofu::loadfile("1.sofu");
$tree->opApply(sub {print $_[0],"\n"}); #Prints all keys

SYNTAX

This Module is pure OO, exports nothing

METHODS

Also look at Data::Sofu::Object for methods, cause Map inherits from it

new([DATA]) Creates a new Data::Sofu::Map and returns it

Converts DATA to appropriate Objects if DATA is given. DATA has to be a Hash or a hashlike structure.

$env = Data::Sofu::Map->new(%ENV);

set(DATA)

Sets the contents of the Map to match a Hash.

$map->set(%ENV);

object(KEY)

Return an attribute identified by KEY of this Map.

$o = $env->object("PATH");
if ($o->isList()) {
	...
}
elsif ($o->isValue()) {
...

Note: Changing the returned Object will change the Map as well. (OO 101)

remAttribute(KEY)

Deletes an Attribute from this Map.

$env->remAttribute("OSTYPE");

setAttribute(KEY, OBJECT)

Replaces/creates an Attribute in this Map identified by KEY and sets it to OBJECT.

$env->setAttribute("PATH", Data::Sofu::List->new(split/:/,$env->value("PATH")->toString()));

hasAttribute(KEY)

Return a true value if this Map has an Attribute identified by KEY

if ($env->hasAttribute("Lines")) {
	print "X" x $env->value("Lines")->toInt();

hasValue(KEY)

Returns 1 if this Map has an Attribute called KEY and this Attribute is a Data::Sofu::Value.

$env->hasValue("PATH") === $env->hasAttribute("PATH") and $env->object("PATH")->isValue();

Note: Return 0 if the Object is not a Value and under if the Element doesn't exist at all.

hasMap(KEY)

Returns 1 if this Map has an Attribute called KEY and this Attribute is a Data::Sofu::Map.

$env->hasMap("PATH") === $env->hasAttribute("PATH") and $env->object("PATH")->isMap();

Note: Return 0 if the Object is not a Value and under if the Element doesn't exist at all.

hasList(KEY)

Returns 1 if this Map has an Attribute called KEY and this Attribute is a Data::Sofu::List.

$env->hasList("PATH") === $env->hasAttribute("PATH") and $env->object("PATH")->isList();

Note: Return 0 if the Object is not a Value and under if the Element doesn't exist at all.

list(KEY)

Returns the Object at the key called KEY as a Data::Sofu::List.

Dies if the Object is not a Data::Sofu::List.

$env->list("PATH") === $env->object("PATH")->asList()

map(KEY)

Returns the Object at the key called KEY as a Data::Sofu::Map.

Dies if the Object is not a Data::Sofu::Map.

$env->map("PATH") === $env->object("PATH")->asMap()

value(KEY)

Returns the Object at the key called KEY as a Data::Sofu::Value.

Dies if the Object is not a Data::Sofu::Value.

$env->value("PATH") === $env->object("PATH")->asValue()

asMap()

Returns itself, used to make sure this Map is really a Map (Data::Sofu::List and Data::Sofu::Value will die if called with this method)

asHash()

Perl only

Returns this Map as a real perl Hash.

isMap()

Returns 1

next()

Returns the next Key, Value pair in no specific order. Used to iterate over the Map.

If called in list context it returns the (Key, Value) as a list, in scalar context it returns [Key, Value] as an Arrayref and in Void Context it resets the Iterator.

while (my ($k,$v) = $env->next()) {
	last if $k eq "PATH";
	print "$k = ".$v->asValue()->ToString()."\n";
}
$env->next() #Reset Iterator

each()

Returns the next Key, Value pair in no specific order. Used to iterate over the Map.

If called in list context it returns the (Key, Value) as a list, in scalar context it returns [Key, Value] as an Arrayref and in Void Context it resets the Iterator.

while (my ($k,$v) = $env->each()) {
	last if $k eq "PATH";
	print "$k = ".$v->asValue()->ToString()."\n";
}
$env->each() #Reset Iterator

length()

Returns the length of this Map

Warning: Resets the Iterator.

opApply(CODE)

Takes a Subroutine and iterates with it over the Map. Values and Keys can't be modified.

The Subroutine takes two Arguments: first is the Key and second is the Value.

$env->opApply(sub {
	print "Key = $_[0], Value = ",$_[1]->asValue->toString(),"\n";
});

Note: The Values are Objects, so they still can be changed, but not replaced.

opApplyDeluxe(CODE)

Perl only.

Takes a Subroutine and iterates with it over the Map. Keys can't be modified, but Values can.

The Subroutine takes two Arguments: first is the Key and second is the Value.

my $i=0;
$env->opApplyDeluxe(sub {
	$_[1]=new Data::Sofu::Value($i++);
});

Note: Please make sure every replaced Value is a Data::Sofu::Object or inherits from it.

storeComment(TREE,COMMENT)

Stores a comment in the Object if TREE is empty, otherwise it propagades the Comment to all its Values

Should not be called directly, use importComments() instead.

orderedKeys()

Return all Keys of the Map in insertion Order

stringify(LEVEL, TREE)

Returns a string representing this Map and all its children.

Runs string(LEVEL+1,TREE+keyname) on all its values.

binaryPack(ENCODING, BYTEORDER, SOFUMARK)

Returns a String containing the binary representaion of this Map (according the Sofu Binary File Format)

Look at Data::Sofu::Binary for the Parameters.

Note: This uses Data::Sofu::Binary::Bin0200 as a only packer.

binarify(TREE,BINARY DRIVER)

Returns the binary version of this Map and all its children using the BINARY DRIVER. Don't call this one, use binaryPack instead

BUGS

This only supports the 2 Argument version of opApply, I have no idea how to find out if a codereference takes 2 or 1 Arguments.

SEE ALSO

Data::Sofu, Data::Sofu::Binary, Data::Sofu::Object, Data::Sofu::List, Data::Sofu::Value, Data::Sofu::Undefined, http://sofu.sf.net