/usr/share/perl5/vendor_perl/URI/urn.pm

https://gitlab.com/kinwei/IFE-task7 · Perl · 98 lines · 80 code · 15 blank · 3 comment · 16 complexity · 94b278b4616092dea583dd678d395521 MD5 · raw file

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