1package URI::urn::isbn;  # RFC 3187
2
3require URI::urn;
4@ISA=qw(URI::urn);
5
6use strict;
7use Business::ISBN ();
8
9
10sub _isbn {
11    my $nss = shift;
12    $nss = $nss->nss if ref($nss);
13    my $isbn = Business::ISBN->new($nss);
14    $isbn = undef if $isbn && !$isbn->is_valid;
15    return $isbn;
16}
17
18sub _nss_isbn {
19    my $self = shift;
20    my $nss = $self->nss(@_);
21    my $isbn = _isbn($nss);
22    $isbn = $isbn->as_string if $isbn;
23    return($nss, $isbn);
24}
25
26sub isbn {
27    my $self = shift;
28    my $isbn;
29    (undef, $isbn) = $self->_nss_isbn(@_);
30    return $isbn;
31}
32
33sub isbn_publisher_code {
34    my $isbn = shift->_isbn || return undef;
35    return $isbn->publisher_code;
36}
37
38sub isbn_country_code {
39    my $isbn = shift->_isbn || return undef;
40    return $isbn->country_code;
41}
42
43sub isbn_as_ean {
44    my $isbn = shift->_isbn || return undef;
45    return $isbn->as_ean;
46}
47
48sub canonical {
49    my $self = shift;
50    my($nss, $isbn) = $self->_nss_isbn;
51    my $new = $self->SUPER::canonical;
52    return $new unless $nss && $isbn && $nss ne $isbn;
53    $new = $new->clone if $new == $self;
54    $new->nss($isbn);
55    return $new;
56}
57
581;
59