Commits

Toby Inkster committed 662072a

initial stuff

Comments (0)

Files changed (9)

+#############################################################
+
+@prefix :        <http://usefulinc.com/ns/doap#> .
+@prefix dcs:     <http://ontologi.es/doap-changeset#> .
+@prefix dc:      <http://purl.org/dc/terms/> .
+@prefix foaf:    <http://xmlns.com/foaf/0.1/> .
+@prefix my:      <http://purl.org/NET/cpan-uri/dist/Example-Example/> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix toby:    <http://tobyinkster.co.uk/#> .
+@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
+
+#############################################################
+
+<>
+
+	dc:title         "Changes" ;
+	dc:description   "Revision history for Perl extension Example::Example."@en ;
+	dc:subject       my:project ;
+	dc:creator       toby:i .
+
+#############################################################
+
+my:v_0-01
+
+	a               :Version ;
+	dc:issued       "2000-01-01"^^xsd:date ;
+	:revision       "0.01"^^xsd:string ;
+	:file-release   <http://backpan.cpan.org/authors/id/T/TO/TOBYINK/Example-Example-0.01.tar.gz> ;
+	rdfs:comment    "Original version"@en .
+
+#############################################################
+
+my:project
+
+	a               :Project ;
+	:name           "Example-Example" ;
+	:shortdesc      "Example Project"@en ;
+	:programming-language  "Perl" ;
+	:homepage       <http://search.cpan.org/dist/Example-Example/> ;
+	:download-page  <http://search.cpan.org/dist/Example-Example/> ;
+	:bug-database   <http://rt.cpan.org/Dist/Display.html?Queue=Example-Example> ;
+	:repository     [ a :SVNRepository ; :browse <http://goddamn.co.uk/viewvc/perlmods/Example-Example/> ] ;
+	:maintainer     toby:i ;
+	:developer      toby:i ;
+	:documenter     toby:i ;
+	:tester         toby:i ;
+	:created        "2000-01-01"^^xsd:date ;
+	:license        <http://dev.perl.org/licenses/> ;
+	:release        my:v_0-01 .
+
+#############################################################
+
+toby:i
+
+	a               foaf:Person ;
+	foaf:name       "Toby Inkster" ;
+	foaf:homepage   <http://tobyinkster.co.uk/> ;
+	foaf:page       <http://search.cpan.org/~tobyink/> ;
+	foaf:mbox       <mailto:tobyink@cpan.org> ;
+	<http://www.w3.org/2002/07/owl#sameAs> <http://purl.org/NET/cpan-uri/person/tobyink> .
+
+#############################################################
+Changes
+Changes.ttl
+Changes.xml
+Makefile.PL
+MANIFEST
+MANIFEST.SKIP
+README
+META.yml
+SIGNATURE
+
+t/00sig.t
+t/01basic.t
+^Makefile$
+^blib/
+^pm_to_blib
+^blibdirs
+\.svn
+^example.*\.pl$
+^[^/]+\.(tar\.gz|tar\.bz2|tgz|tbz2|tbz|zip|tar)$
+^MYMETA..yml
+use strict;
+use warnings;
+
+use inc::Module::Install;
+
+my $dist = 'Example-Example';
+my $fn   = "lib/$dist.pm"; $fn =~ s#-#/#g;
+
+name                $dist;
+perl_version_from   $fn;
+version_from        $fn;
+abstract_from       $fn;
+readme_from         $fn;
+author              'Toby Inkster <tobyink@cpan.org>';
+license             'perl';
+
+test_requires       'Test::More' => '0.61';
+
+requires            'Carp'               => '1.00';
+requires            'DateTime'           => 0;
+requires            'RDF::Trine'         => '0.112';
+requires            'XML::LibXML'        => '1.60';
+requires            'URI'                => '1.30';
+
+# install_script 'fingerw';
+
+resources(
+	'homepage'   => "http://search.cpan.org/dist/$dist/",
+	'repository' => "http://goddamn.co.uk/viewvc/perlmods/$dist/",
+	'bugtracker' => "http://rt.cpan.org/Dist/Display.html?Queue=$dist",
+	);
+	
+write_doap_changes;
+write_doap_changes_xml;
+
+include 'Test::Signature';
+auto_install;
+WriteAll(
+	'meta' => 1,
+	'sign' => 1,
+	);

lib/RDF/Prefixes.pm

+package RDF::Prefixes;
+
+use 5.008;
+use common::sense;
+
+use Carp qw[];
+
+our $VERSION = '0.001';
+our ($r_nameStartChar, $r_nameChar, $r_prefix);
+
+BEGIN
+{
+	$r_nameStartChar = qr'[A-Za-z\x{00C0}-\x{00D6}\x{00D8}-\x{00F6}\x{00F8}-\x{02FF}\x{0370}-\x{037D}\x{037F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{00010000}-\x{000EFFFF}]';
+	$r_nameChar      = qr'${r_nameStartChar}|[-_0-9\x{b7}\x{0300}-\x{036f}\x{203F}-\x{2040}]';
+	$r_prefix        = qr'${r_nameStartChar}${r_nameChar}*';
+}
+
+sub new
+{
+	my ($class, $suggested) = @_;
+	$suggested ||= {};
+	my $self = {};
+		
+	foreach my $s (reverse sort keys %$suggested)
+	{
+		if ($s =~ /^[a-z0-9][a-z0-9_\.]*$/i)
+		{
+			$self->{suggested}{ $suggested->{$s} } = $s;
+		}
+		else
+		{
+			Carp::carp "Ignored suggestion $s => " . $suggested->{$s};
+		}
+	}
+	
+	return bless $self, $class;
+}
+
+sub get_prefix
+{
+	my ($self, $url) = @_;
+	my $pp = $self->_practical_prefix($url);
+	$self->hashref->{ $pp } = $url;
+	return $pp;
+}
+
+sub preview_prefix
+{
+	return _practical_prefix(@_);
+}
+
+sub get_qname
+{
+	my ($self, $url) = @_;
+	
+	my ($p, $s) = $self->_split_qname($url);
+	return undef unless defined $p and defined $s;
+	
+	return $self->get_prefix($p) . ':' . $s;
+}
+
+sub preview_qname
+{
+	my ($self, $url) = @_;
+	
+	my ($p, $s) = $self->_split_qname($url);
+	return undef unless defined $p and defined $s;
+	
+	return $self->preview_prefix($p) . ':' .  $s;
+}
+
+sub get_curie
+{
+	my ($self, $url) = @_;
+	
+	my ($p, $s) = $self->_split_qname($url);
+	
+	return $self->get_prefix($url) . ':'
+		unless defined $p and defined $s;
+	
+	return $self->get_prefix($p) . ':' .  $s;
+}
+
+sub preview_curie
+{
+	my ($self, $url) = @_;
+	
+	my ($p, $s) = $self->_split_qname($url);
+	
+	return $self->preview_prefix($url) . ':'
+		unless defined $p and defined $s;
+	
+	return $self->preview_prefix($p) . ':' . $s;
+}
+
+sub hashref
+{
+	my ($self) = @_;
+	$self->{used} ||= {};
+	return $self->{used};
+}
+
+sub rdfa
+{
+	my ($self) = @_;
+	my $rv;
+	foreach my $prefix (sort keys %{ $self->hashref })
+	{
+		$rv .= sprintf("%s: %s ",
+			$prefix,
+			$self->hashref->{$prefix});
+	}
+	return substr($rv, 0, (length $rv) - 1);
+}
+
+sub sparql
+{
+	my ($self) = @_;
+	my $rv;
+	foreach my $prefix (sort keys %{ $self->hashref })
+	{
+		$rv .= sprintf("PREFIX %s: <%s>\n",
+			$prefix,
+			$self->hashref->{$prefix});
+	}
+	return $rv;
+}
+
+sub turtle
+{
+	my ($self) = @_;
+	my $rv;
+	foreach my $prefix (sort keys %{ $self->hashref })
+	{
+		$rv .= sprintf("\@prefix %s: <%s> .\n",
+			$prefix,
+			$self->hashref->{$prefix});
+	}
+	return $rv;
+}
+
+sub xmlns
+{
+	my ($self) = @_;
+	my $rv;
+	foreach my $prefix (sort keys %{ $self->hashref })
+	{
+		$rv .= sprintf(" xmlns:%s=\"%s\"",
+			$prefix,
+			$self->hashref->{$prefix});
+	}
+	return $rv;
+}
+
+sub _split_qname
+{
+	my ($self, $uri) = @_;
+        
+	my $nameStartChar  = qr<([A-Za-z_]|[\x{C0}-\x{D6}]|[\x{D8}-\x{D8}]|[\x{F8}-\x{F8}]|[\x{200C}-\x{200C}]|[\x{37F}-\x{1FFF}][\x{200C}-\x{200C}]|[\x{2070}-\x{2070}]|[\x{2C00}-\x{2C00}]|[\x{3001}-\x{3001}]|[\x{F900}-\x{F900}]|[\x{FDF0}-\x{FDF0}]|[\x{10000}-\x{10000}])>;
+	my $nameChar       = qr<$nameStartChar|-|[.]|[0-9]|\x{B7}|[\x{0300}-\x{036F}]|[\x{203F}-\x{2040}]>;
+	my $lnre           = qr<((${nameStartChar})($nameChar)*)>;
+	
+   if ($uri =~ m/${lnre}$/)
+	{
+		my $ln  = $1;
+		my $ns  = substr($uri, 0, length($uri)-length($ln));
+		return ($ns, $ln);
+	}
+	
+	return;
+}
+
+sub _perfect_prefix
+{
+	my ($self, $url) = @_;
+	
+	my $chosen = {
+		'http://www.w3.org/1999/02/22-rdf-syntax-ns#' => 'rdf',
+		'http://www.w3.org/2000/01/rdf-schema#'       => 'rdfs',
+		'http://www.w3.org/2002/07/owl#'              => 'owl',
+		'http://www.w3.org/2001/XMLSchema#'           => 'xsd',
+		}->{$url};
+	
+	return $chosen if length $chosen;
+
+	(my $extensionRemoved = $url) =~ /\.(owl|rdf|rdfx|rdfs|nt|ttl|turtle|xml)$/i;
+	my @words = split /[^A-Za-z0-9\._-]/, $extensionRemoved;
+	WORD: while (my $w = pop @words)
+	{
+		next unless length $w;
+		next if $w =~ /^[0-9\.-]+$/; # looks like a date or version number
+		next if $w =~ /^(terms|ns|vocab|vocabulary|rdf|rdfs|owl|schema)$/i; # too generic
+		next unless $w =~ /^[a-z0-9][a-z0-9_\.]*$/i;
+		
+		$chosen = $w;
+		last WORD;
+	}
+	
+	return lc $chosen;
+}
+
+sub _practical_prefix
+{
+	my ($self, $url) = @_;
+
+	while (my ($existing_prefix, $full) = each %{ $self->hashref })
+	{
+		return $existing_prefix if $full eq $url;
+	}
+	
+	my $perfect = $self->{suggested}{$url}
+		|| $self->_perfect_prefix($url)
+		|| 'ns';
+	return $perfect unless defined $self->hashref->{$perfect};
+	
+	my $i = 2;
+	while (defined $self->hashref->{$perfect . $i})
+	{
+		$i++;
+	}
+	return $perfect . $i;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+RDF::Prefixes - simple way to turn URIs into QNames.
+
+=head1 SYNOPSIS
+
+ my $context = RDF::Prefixes->new;
+ say $context->qname('http://purl.org/dc/terms/title');  # dc:title
+ say $context->qname('http://example.net/rdf/dc#title'); # dc2:title
+ say $context->turtle;  # @prefix dc: <http://purl.org/dc/terms/> .
+                        # @prefix dc2: <http://example.net/rdf/dc#> .
+
+=head1 DESCRIPTION
+
+=head2 Constructor
+
+=over 4
+
+=item C<< new(\%suggestions) >>
+
+Creates a new RDF prefix context.
+
+Suggestions for prefix mappings may be given, but there's no guarantee
+that they'll be used.
+
+=back
+
+=head2 Methods
+
+=over 4
+
+=item C<< get_prefix($uri) >>
+
+Gets the prefix associated with a URI. e.g.
+C<< get_prefix('http://purl.org/dc/terms/') >> might return 'dc'.
+
+=item C<< get_qname($uri) >>
+
+Gets a QName for a URI. e.g.
+C<< get_prefix('http://purl.org/dc/terms/title') >> might return 'dc:title'.
+
+Some URIs cannot be converted to QNames. In these cases, undef is returned.
+
+=item C<< get_curie($uri) >>
+
+As per C<get_qname>, but allows for more relaxed return values, suitable
+for RDFa, Turtle or Notation 3, but not RDF/XML. Should never need to
+return undef.
+
+=item C<< preview_prefix($uri) >>,
+C<< preview_qname($uri) >>,
+C<< preview_curie($uri) >>
+
+As per the "get" versions of these methods, but doesn't change the
+context.
+
+=item C<< hashref >>
+
+Returns a hashref of prefix mappings used so far.
+
+=item C<< rdfa >>
+
+Return the same data as C<hashref>, but as a string suitable for
+placing in an RDFa 1.1 prefix attribute.
+
+=item C<< sparql >>
+
+Return the same data as C<hashref>, but as a string suitable for
+prefixing a SPARQL query.
+
+=item C<< turtle >>
+
+Return the same data as C<hashref>, but as a string suitable for
+prefixing a Turtle or Notation 3 file.
+
+=item C<< xmlns >>
+
+Return the same data as C<hashref>, but as a string of xmlns
+attributes, suitable for use with RDF/XML or RDFa.
+
+=back
+
+=head1 BUGS
+
+Please report any bugs to L<http://rt.cpan.org/>.
+
+=head1 AUTHOR
+
+Toby Inkster E<lt>tobyink@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2010 Toby Inkster
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.el \{\
+.    de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "RDF::Prefixes 3"
+.TH RDF::Prefixes 3 "2010-09-05" "perl v5.10.1" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+RDF::Prefixes \- simple way to turn URIs into QNames.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+.Vb 5
+\& my $context = RDF::Prefixes\->new;
+\& say $context\->qname(\*(Aqhttp://purl.org/dc/terms/title\*(Aq);  # dc:title
+\& say $context\->qname(\*(Aqhttp://example.net/rdf/dc#title\*(Aq); # dc2:title
+\& say $context\->turtle;  # @prefix dc: <http://purl.org/dc/terms/> .
+\&                        # @prefix dc2: <http://example.net/rdf/dc#> .
+.Ve
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+.SS "Constructor"
+.IX Subsection "Constructor"
+.ie n .IP """new(\e%suggestions)""" 4
+.el .IP "\f(CWnew(\e%suggestions)\fR" 4
+.IX Item "new(%suggestions)"
+Creates a new \s-1RDF\s0 prefix context.
+.Sp
+Suggestions for prefix mappings may be given, but there's no guarantee
+that they'll be used.
+.SS "Methods"
+.IX Subsection "Methods"
+.ie n .IP """get_prefix($uri)""" 4
+.el .IP "\f(CWget_prefix($uri)\fR" 4
+.IX Item "get_prefix($uri)"
+Gets the prefix associated with a \s-1URI\s0. e.g.
+\&\f(CW\*(C`get_prefix(\*(Aqhttp://purl.org/dc/terms/\*(Aq)\*(C'\fR might return 'dc'.
+.ie n .IP """get_qname($uri)""" 4
+.el .IP "\f(CWget_qname($uri)\fR" 4
+.IX Item "get_qname($uri)"
+Gets a QName for a \s-1URI\s0. e.g.
+\&\f(CW\*(C`get_prefix(\*(Aqhttp://purl.org/dc/terms/title\*(Aq)\*(C'\fR might return 'dc:title'.
+.Sp
+Some URIs cannot be converted to QNames. In these cases, undef is returned.
+.ie n .IP """get_curie($uri)""" 4
+.el .IP "\f(CWget_curie($uri)\fR" 4
+.IX Item "get_curie($uri)"
+As per \f(CW\*(C`get_qname\*(C'\fR, but allows for more relaxed return values, suitable
+for RDFa, Turtle or Notation 3, but not \s-1RDF/XML\s0. Should never need to
+return undef.
+.ie n .IP """preview_prefix($uri)"", ""preview_qname($uri)"", ""preview_curie($uri)""" 4
+.el .IP "\f(CWpreview_prefix($uri)\fR, \f(CWpreview_qname($uri)\fR, \f(CWpreview_curie($uri)\fR" 4
+.IX Item "preview_prefix($uri), preview_qname($uri), preview_curie($uri)"
+As per the \*(L"get\*(R" versions of these methods, but doesn't change the
+context.
+.ie n .IP """hashref""" 4
+.el .IP "\f(CWhashref\fR" 4
+.IX Item "hashref"
+Returns a hashref of prefix mappings used so far.
+.ie n .IP """rdfa""" 4
+.el .IP "\f(CWrdfa\fR" 4
+.IX Item "rdfa"
+Return the same data as \f(CW\*(C`hashref\*(C'\fR, but as a string suitable for
+placing in an RDFa 1.1 prefix attribute.
+.ie n .IP """sparql""" 4
+.el .IP "\f(CWsparql\fR" 4
+.IX Item "sparql"
+Return the same data as \f(CW\*(C`hashref\*(C'\fR, but as a string suitable for
+prefixing a \s-1SPARQL\s0 query.
+.ie n .IP """turtle""" 4
+.el .IP "\f(CWturtle\fR" 4
+.IX Item "turtle"
+Return the same data as \f(CW\*(C`hashref\*(C'\fR, but as a string suitable for
+prefixing a Turtle or Notation 3 file.
+.ie n .IP """xmlns""" 4
+.el .IP "\f(CWxmlns\fR" 4
+.IX Item "xmlns"
+Return the same data as \f(CW\*(C`hashref\*(C'\fR, but as a string of xmlns
+attributes, suitable for use with \s-1RDF/XML\s0 or RDFa.
+.SH "BUGS"
+.IX Header "BUGS"
+Please report any bugs to <http://rt.cpan.org/>.
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Toby Inkster <tobyink@cpan.org>.
+.SH "COPYRIGHT"
+.IX Header "COPYRIGHT"
+Copyright 2010 Toby Inkster
+.PP
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+use lib 'inc';
+use Test::More tests => 1;
+use Test::Signature;
+signature_ok();
+use Test::More tests => 1;
+BEGIN { use_ok('Example::Example') };
+
+#!/usr/bin/perl
+
+use 5.010;
+use common::sense;
+use lib "lib";
+use RDF::Prefixes;
+
+my $c = RDF::Prefixes->new({ex=>'http://example.com/'});
+
+say $c->get_qname('http://xmlns.com/foaf/0.1/homepage');
+say $c->get_qname('http://xmlns.com/foaf/0.1/');
+say $c->get_curie('http://purl.org/dc/terms/title');
+say $c->get_curie('http://purl.org/dc/terms/');
+say $c->get_curie('http://purl.org/dc/elements/1.0/title');
+say $c->get_curie('http://purl.org/dc/elements/1.1/title');
+say '----';
+say $c->turtle;
+