RDF::Trine::NamespaceMap - Collection of Namespaces


RDF-Trine documentation Contained in the RDF-Trine distribution.

Index


Code Index:

NAME

Top

RDF::Trine::NamespaceMap - Collection of Namespaces

VERSION

Top

This document describes RDF::Trine::NamespaceMap version 0.135

SYNOPSIS

Top

    use RDF::Trine::NamespaceMap;
    my $map = RDF::Trine::NamespaceMap->new( \%namespaces );
    $serializer->serialize_model_to_string( $model, namespaces => $map );

    $map->add_mapping( foaf => 'http://xmlns.com/foaf/0.1/' );
    my $foaf_namespace = $map->foaf;
    my $foaf_person    = $map->foaf('Person');

DESCRIPTION

Top

This module provides an object to manage multiple namespaces for creating RDF::Trine::Node::Resource objects and for serializing.

METHODS

Top

new ( [ \%namespaces ] )

Returns a new namespace map object. You can pass a hash reference with mappings from local names to namespace URIs (given as string or RDF::Trine::Node::Resource).

add_mapping ( $name => $uri )

Adds a new namespace to the map. The namespace URI can be passed as string or some object, that provides an uri_value method.

remove_mapping ( $name )

Removes a namespace from the map.

namespace_uri ( $name )

Returns the namespace object (if any) associated with the given name.

uri ( $prefixed_name )

Returns a URI (as RDF::Trine::Node::Resource) for an abbreviated string such as 'foaf:Person'.

WARNING

Top

Avoid using the names 'can', 'isa', 'VERSION', and 'DOES' as namespace prefix, because these names are defined as method for every Perl object by default. The method names 'new' and 'uri' are also forbidden.

BUGS

Top

Please report any bugs or feature requests to <gwilliams@cpan.org>.

AUTHOR

Top

Gregory Todd Williams <gwilliams@cpan.org>

COPYRIGHT

Top


RDF-Trine documentation Contained in the RDF-Trine distribution.
# RDF::Trine::NamespaceMap
# -----------------------------------------------------------------------------


package RDF::Trine::NamespaceMap;

use strict;
use warnings;
no warnings 'redefine';
use Scalar::Util qw(blessed);
use Data::Dumper;

######################################################################

our ($VERSION);
BEGIN {
	$VERSION	= '0.135';
}

######################################################################

sub new {
	my $class	= shift;
	my $map		= shift || {};
	my $self	= bless( {}, $class );
	foreach my $name ( keys %$map ) {
		$self->add_mapping( $name => $map->{$name} );
	}
	return $self;
}

sub add_mapping {
	my $self	= shift;
	my $name	= shift;
	if ($name =~ /^(new|uri|can|isa|VERSION|DOES)$/) {
		# reserved names
		throw RDF::Trine::Error::MethodInvocationError -text => "Cannot use reserved name '$name' as a namespace prefix";
	}
	
	my $ns		= shift;
	foreach (qw(1 2)) {
		# loop twice because the first call to C<<uri_value>> might return a
		# RDF::Trine::Namespace. Calling C<<uri_value>> on the namespace object
		# will then return a URI string value.
		if (blessed($ns) and $ns->can('uri_value')) {
			$ns = $ns->uri_value;
		}
	}
	$ns	= RDF::Trine::Namespace->new( $ns );
	$self->{ $name }	= $ns;
}

sub remove_mapping {
	my $self	= shift;
	my $name	= shift;
	delete $self->{ $name };
}

sub namespace_uri {
	my $self	= shift;
	my $name	= shift;
	return $self->{ $name };
}

sub uri {
	my $self	= shift;
	my $abbr	= shift;
	my $ns;
	my $local	= "";
	if ($abbr =~ m/^([^:]+):(.*)$/) {
		$ns	= $self->{ $1 };
		$local	= $2;
	} else {
		$ns	= $self->{ $abbr };
	}
	return unless (blessed($ns));
	if ($local ne '') {
		return $ns->$local();
	} else {
		return $ns->uri_value;
	}
}

sub AUTOLOAD {
	my $self	= shift;
	our $AUTOLOAD;
	return if ($AUTOLOAD =~ /:DESTROY$/);
	my ($name)	= ($AUTOLOAD =~ m/^.*:(.*)$/);
	my $ns		= $self->{ $name };
	return unless (blessed($ns));
	if (scalar(@_)) {
		my $local	= shift(@_);
		return $ns->$local( @_ );
	} else {
		return $ns;
	}
}

1; # Magic true value required at end of module
__END__