blob: 4c594f5b5daae135729b81672b056ea65a8d17ce (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
package URI::urn; # RFC 2141
use strict;
use warnings;
use parent 'URI';
use Carp qw(carp);
my %implementor;
sub _init {
my $class = shift;
my $self = $class->SUPER::_init(@_);
my $nid = $self->nid;
my $impclass = $implementor{$nid};
return $impclass->_urn_init($self, $nid) if $impclass;
$impclass = "URI::urn";
if ($nid =~ /^[A-Za-z\d][A-Za-z\d\-]*\z/) {
my $id = $nid;
# make it a legal perl identifier
$id =~ s/-/_/g;
$id = "_$id" if $id =~ /^\d/;
$impclass = "URI::urn::$id";
no strict 'refs';
unless (@{"${impclass}::ISA"}) {
# Try to load it
eval "require $impclass";
die $@ if $@ && $@ !~ /Can\'t locate.*in \@INC/;
$impclass = "URI::urn" unless @{"${impclass}::ISA"};
}
}
else {
carp("Illegal namespace identifier '$nid' for URN '$self'") if $^W;
}
$implementor{$nid} = $impclass;
return $impclass->_urn_init($self, $nid);
}
sub _urn_init {
my($class, $self, $nid) = @_;
bless $self, $class;
}
sub _nid {
my $self = shift;
my $opaque = $self->opaque;
if (@_) {
my $v = $opaque;
my $new = shift;
$v =~ s/[^:]*/$new/;
$self->opaque($v);
# XXX possible rebless
}
$opaque =~ s/:.*//s;
return $opaque;
}
sub nid { # namespace identifier
my $self = shift;
my $nid = $self->_nid(@_);
$nid = lc($nid) if defined($nid);
return $nid;
}
sub nss { # namespace specific string
my $self = shift;
my $opaque = $self->opaque;
if (@_) {
my $v = $opaque;
my $new = shift;
if (defined $new) {
$v =~ s/(:|\z).*/:$new/;
}
else {
$v =~ s/:.*//s;
}
$self->opaque($v);
}
return undef unless $opaque =~ s/^[^:]*://;
return $opaque;
}
sub canonical {
my $self = shift;
my $nid = $self->_nid;
my $new = $self->SUPER::canonical;
return $new if $nid !~ /[A-Z]/ || $nid =~ /%/;
$new = $new->clone if $new == $self;
$new->nid(lc($nid));
return $new;
}
1;
|