package RDF::Simple::NS;

use strict;

our $VERSION = '0.3';

sub new {
        my $class = shift;
        my %p = @_;
        return bless \%p, ref $class || $class;
}

sub baseuri {
        my $self = shift;
        my $baseuri = shift;
        $self->{baseuri} ||= $baseuri;
        return $self->{baseuri};
}

sub from_qname {
    my ($self,$name) = @_;
    my $ns;
    if (($name =~ m/\:/) and ($name !~ m/^http/))  {
        my ($space,$n) = split(':',$name);
        $ns = $self->entity_to_namespace($space);
        $name = $n;
    }
    $ns ||= $self->baseuri;
    return $ns.$name;
}

sub qname {
    my ($self,$thing) = @_;
    my ($ns,$part) = $thing =~ /(.+[\/|\#])(.+)/;

    my $entity = $self->namespace_to_entity($ns);
    $thing = $entity.':'.$part if $entity;
    return $thing;
}

# Retrieve or add to the entity to namespace lookup hash
sub lookup {
    my ($self,%add) = @_;
    $self->{_lookup} ||=
    {
        foaf => 'http://xmlns.com/foaf/0.1/',
        dc => 'http://purl.org/dc/elements/1.1/',
        rdfs => "http://www.w3.org/2000/01/rdf-schema#",
        daml => 'http://www.w3.org/2001/10/daml+oil#',
        space => 'http://frot.org/space/0.1/',
        geo => 'http://www.w3.org/2003/01/geo/wgs84_pos#',
        rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        owl => 'http://www.w3.org/2002/07/owl#',
        ical => 'http://www.w3.org/2002/12/cal/ical#',
        dcterms=>"http://purl.org/dc/terms/",
        wiki=>"http://purl.org/rss/1.0/modules/wiki/",
        chefmoz=>"http://chefmoz.org/rdf/elements/1.0/",
        wot => "http://xmlns.com/wot/0.1/",
        cng => 'http://iconocla.st/cng#',
	status => 'http://www.w3.org/2003/06/sw-vocab-status/ns#',
         };

    foreach (keys %add) {
        $self->{_lookup}->{$_} = $add{$_};
    }
    return %{$self->{_lookup}};
}

sub entity_to_namespace {
    my ($self,$entity) = @_;
    my %lookup = $self->lookup;
    my $e = $lookup{$entity};
    return $e;
}

sub uri {
    my ($self,$entity) = @_;
    if ($entity =~ m/\:/) {
        return $self->from_qname($entity);
    }
    else {
        return $self->entity_to_namespace($entity);
    }
}

sub namespace_to_entity {
    my ($self,$ns) = @_;
    #$ns =~ s/\#//g;
    my %look = reverse $self->lookup;
    return $look{$ns} if $ns and (exists $look{$ns});
}

sub prefix {
    my ($self,$string) = @_;
    if ($string) {
    	$string =~ s/:.+//;
    	return $string if $string;
    }
    return undef;
}

=head1 RDF::Simple::NS 

=head1 DESCRIPTION

A utility class to help deal with RDF namespaces
(converting between short (qualified) names
and full URLs for XML namespaces.

=head1 SYNOPSIS

	my $ns = RDF::Simple::NS->new;
	$ns->lookup('foaf'=>'http://xmlns.com/foaf/0.1/');

=head2 METHODS

=head3 from_qname 

=head3 qname

=head3 lookup
	
	$ns->lookup('short name'=>'http://full.path.to/namespace#');

Add an alias for a namespace (this will be used in the serialisation)

=head3 entity_to_namespace

=head3 uri 

=head3 namespace_to_entity 

=head3 prefix 


1;
