.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) .\" .\" 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" '' . ds C` . ds C' '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 >0, 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. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .if !\nF .nr F 0 .if \nF>0 \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} .\} .\" .\" 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 "WebService::ILS 3pm" .TH WebService::ILS 3pm "2018-10-11" "perl v5.26.2" "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" WebService::ILS \- Standardised library discovery/circulation services .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 10 \& use WebService::ILS::; \& my $ils = WebService::ILS::\->new({ \& client_id => $client_id, \& client_secret => $client_secret \& }); \& my %search_params = ( \& query => "Some keyword", \& sort => "rating", \& ); \& my $result = $ils\->search(\e%search_params); \& foreach (@{ $result\->{items} }) { \& ... \& } \& foreach (2..$result\->{pages}) { \& $search_params{page} = $_; \& my $next_results = $ils\->search(\e%search_params); \& ... \& } \& \& or \& \& my $native_result = $ils\->native_search(\e%native_search_params); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" WebService::ILS is an attempt to create a standardised interface for online library services providers. .PP In addition, native \s-1API\s0 interface is provided. .PP Here we will describe constructor parameters and methods common to all service providers. Diversions and native interfaces are documented in corresponding modules. .SS "Supported service providers" .IX Subsection "Supported service providers" .IP "\fBWebService::ILS::OverDrive::Library\fR" 4 .IX Item "WebService::ILS::OverDrive::Library" OverDrive Library \s-1API\s0 .IP "\fBWebService::ILS::OverDrive::Patron\fR" 4 .IX Item "WebService::ILS::OverDrive::Patron" OverDrive Circulation \s-1API\s0 .SH "INTERFACE" .IX Header "INTERFACE" .SS "Error handling" .IX Subsection "Error handling" Method calls will die on error. $@ will contain a multi-line string. See \f(CW\*(C`error_message()\*(C'\fR below. .SS "Item record" .IX Subsection "Item record" Item record is returned by many methods, so we specify it here. .ie n .IP """id""" 12 .el .IP "\f(CWid\fR" 12 .IX Item "id" .PD 0 .ie n .IP """isbn""" 12 .el .IP "\f(CWisbn\fR" 12 .IX Item "isbn" .ie n .IP """title""" 12 .el .IP "\f(CWtitle\fR" 12 .IX Item "title" .ie n .IP """subtitle""" 12 .el .IP "\f(CWsubtitle\fR" 12 .IX Item "subtitle" .ie n .IP """description""" 12 .el .IP "\f(CWdescription\fR" 12 .IX Item "description" .ie n .IP """author""" 12 .el .IP "\f(CWauthor\fR" 12 .IX Item "author" .ie n .IP """publisher""" 12 .el .IP "\f(CWpublisher\fR" 12 .IX Item "publisher" .ie n .IP """publication_date""" 12 .el .IP "\f(CWpublication_date\fR" 12 .IX Item "publication_date" .ie n .IP """language""" 12 .el .IP "\f(CWlanguage\fR" 12 .IX Item "language" .ie n .IP """rating"" => user ratings metrics" 12 .el .IP "\f(CWrating\fR => user ratings metrics" 12 .IX Item "rating => user ratings metrics" .ie n .IP """popularity"" => checkout metrics" 12 .el .IP "\f(CWpopularity\fR => checkout metrics" 12 .IX Item "popularity => checkout metrics" .ie n .IP """subjects"" => subject categories (tags)" 12 .el .IP "\f(CWsubjects\fR => subject categories (tags)" 12 .IX Item "subjects => subject categories (tags)" .ie n .IP """facets"" => a hashref of facet => [values]" 12 .el .IP "\f(CWfacets\fR => a hashref of facet => [values]" 12 .IX Item "facets => a hashref of facet => [values]" .ie n .IP """media"" => book, e\-book, video, audio etc" 12 .el .IP "\f(CWmedia\fR => book, e\-book, video, audio etc" 12 .IX Item "media => book, e-book, video, audio etc" .ie n .IP """formats"" => an arrayref of available formats" 12 .el .IP "\f(CWformats\fR => an arrayref of available formats" 12 .IX Item "formats => an arrayref of available formats" .ie n .IP """images"" => a hashref of size => url" 12 .el .IP "\f(CWimages\fR => a hashref of size => url" 12 .IX Item "images => a hashref of size => url" .ie n .IP """encryption_key"" => for decryption purposes" 12 .el .IP "\f(CWencryption_key\fR => for decryption purposes" 12 .IX Item "encryption_key => for decryption purposes" .ie n .IP """drm"" => subject to drm" 12 .el .IP "\f(CWdrm\fR => subject to drm" 12 .IX Item "drm => subject to drm" .PD .PP Not all fields are available for all service providers. Field values are not standardised. .SH "CONSTRUCTOR" .IX Header "CONSTRUCTOR" .ie n .SS "new (%params_hash or $params_hashref)" .el .SS "new (%params_hash or \f(CW$params_hashref\fP)" .IX Subsection "new (%params_hash or $params_hashref)" \fIClient (vendor) related constructor params, given by service provider:\fR .IX Subsection "Client (vendor) related constructor params, given by service provider:" .ie n .IP """client_id"" => client (vendor) identifier" 12 .el .IP "\f(CWclient_id\fR => client (vendor) identifier" 12 .IX Item "client_id => client (vendor) identifier" .PD 0 .ie n .IP """client_secret"" => secret key (password)" 12 .el .IP "\f(CWclient_secret\fR => secret key (password)" 12 .IX Item "client_secret => secret key (password)" .ie n .IP """library_id"" => sometimes service providers provide access to differnt ""libraries""" 12 .el .IP "\f(CWlibrary_id\fR => sometimes service providers provide access to differnt ``libraries''" 12 .IX Item "library_id => sometimes service providers provide access to differnt libraries" .PD .PP \fIGeneral constructor params:\fR .IX Subsection "General constructor params:" .ie n .IP """user_agent"" => LWP::UserAgent or a derivative; usually not needed, one is created for you." 12 .el .IP "\f(CWuser_agent\fR => LWP::UserAgent or a derivative; usually not needed, one is created for you." 12 .IX Item "user_agent => LWP::UserAgent or a derivative; usually not needed, one is created for you." .PD 0 .ie n .IP """user_agent_params"" => LWP::UserAgent constructor params so you don't need to create user agent yourself" 12 .el .IP "\f(CWuser_agent_params\fR => LWP::UserAgent constructor params so you don't need to create user agent yourself" 12 .IX Item "user_agent_params => LWP::UserAgent constructor params so you don't need to create user agent yourself" .ie n .IP """access_token"" => as returned from the provider authentication system" 12 .el .IP "\f(CWaccess_token\fR => as returned from the provider authentication system" 12 .IX Item "access_token => as returned from the provider authentication system" .ie n .IP """access_token_type"" => as returned from the provider authentication system" 12 .el .IP "\f(CWaccess_token_type\fR => as returned from the provider authentication system" 12 .IX Item "access_token_type => as returned from the provider authentication system" .PD .PP These are also read-only attributes .PP Not all of client/library params are required for all service providers. .SH "ATTRIBUTES" .IX Header "ATTRIBUTES" .SS "user_agent" .IX Subsection "user_agent" As provided to constructor, or auto created. Useful if one wants to change user agent attributes on the fly, eg .PP .Vb 1 \& $ils\->user_agent\->timeout(120); .Ve .SH "DISCOVERY METHODS" .IX Header "DISCOVERY METHODS" .SS "search ($params_hashref)" .IX Subsection "search ($params_hashref)" \fIInput params:\fR .IX Subsection "Input params:" .ie n .IP """query"" => query (search) string" 12 .el .IP "\f(CWquery\fR => query (search) string" 12 .IX Item "query => query (search) string" .PD 0 .ie n .IP """page_size"" => number of items per results page" 12 .el .IP "\f(CWpage_size\fR => number of items per results page" 12 .IX Item "page_size => number of items per results page" .ie n .IP """page"" => wanted page number" 12 .el .IP "\f(CWpage\fR => wanted page number" 12 .IX Item "page => wanted page number" .ie n .IP """sort"" => resultset sort option (see below)" 12 .el .IP "\f(CWsort\fR => resultset sort option (see below)" 12 .IX Item "sort => resultset sort option (see below)" .PD .PP Sort options are either an array or a comma separated string of options: .ie n .IP """publication_date"" => date title was published" 12 .el .IP "\f(CWpublication_date\fR => date title was published" 12 .IX Item "publication_date => date title was published" .PD 0 .ie n .IP """available_date"" => date title became available for users" 12 .el .IP "\f(CWavailable_date\fR => date title became available for users" 12 .IX Item "available_date => date title became available for users" .ie n .IP """rating"" => number of items per results page" 12 .el .IP "\f(CWrating\fR => number of items per results page" 12 .IX Item "rating => number of items per results page" .PD .PP Sort order can be added after option with \*(L":\*(R", eg \&\*(L"publication_date:desc,rating:desc\*(R" .PP \fIReturns search results record:\fR .IX Subsection "Returns search results record:" .ie n .IP """items"" => an array of item records" 12 .el .IP "\f(CWitems\fR => an array of item records" 12 .IX Item "items => an array of item records" .PD 0 .ie n .IP """page_size"" => number of items per results page" 12 .el .IP "\f(CWpage_size\fR => number of items per results page" 12 .IX Item "page_size => number of items per results page" .ie n .IP """page"" => results page number" 12 .el .IP "\f(CWpage\fR => results page number" 12 .IX Item "page => results page number" .ie n .IP """pages"" => total number of pages" 12 .el .IP "\f(CWpages\fR => total number of pages" 12 .IX Item "pages => total number of pages" .ie n .IP """total"" => total number of items found by the search" 12 .el .IP "\f(CWtotal\fR => total number of items found by the search" 12 .IX Item "total => total number of items found by the search" .PD .SS "item_metadata ($item_id)" .IX Subsection "item_metadata ($item_id)" \fIReturns item record\fR .IX Subsection "Returns item record" .SS "item_availability ($item_id)" .IX Subsection "item_availability ($item_id)" \fIReturns item availability record:\fR .IX Subsection "Returns item availability record:" .ie n .IP """id""" 12 .el .IP "\f(CWid\fR" 12 .IX Item "id" .PD 0 .ie n .IP """available"" => boolean" 12 .el .IP "\f(CWavailable\fR => boolean" 12 .IX Item "available => boolean" .ie n .IP """copies_available"" => number of copies available" 12 .el .IP "\f(CWcopies_available\fR => number of copies available" 12 .IX Item "copies_available => number of copies available" .ie n .IP """copies_owned"" => number of copies owned" 12 .el .IP "\f(CWcopies_owned\fR => number of copies owned" 12 .IX Item "copies_owned => number of copies owned" .ie n .IP """type"" => availability type, provider dependant" 12 .el .IP "\f(CWtype\fR => availability type, provider dependant" 12 .IX Item "type => availability type, provider dependant" .PD .PP Not all fields are available for all service providers. For example, some will provide \*(L"copies_available\*(R", making \*(L"available\*(R" redundant, whereas others will just provide \*(L"available\*(R". .SS "is_item_available ($item_id)" .IX Subsection "is_item_available ($item_id)" \fIReturns boolean\fR .IX Subsection "Returns boolean" .PP Simplified version of \fIitem_availability()\fR .SH "INDIVIDUAL USER AUTHENTICATION AND METHODS" .IX Header "INDIVIDUAL USER AUTHENTICATION AND METHODS" .SS "user_id / password" .IX Subsection "user_id / password" Provider authentication \s-1API\s0 is used to get an authorized session. .PP \fIauth_by_user_id($user_id, \f(CI$password\fI)\fR .IX Subsection "auth_by_user_id($user_id, $password)" .PP An example: .PP .Vb 10 \& my $ils = WebService::ILS::Provider({ \& client_id => $client_id, \& client_secret => $client_secret, \& }); \& eval { $ils\->auth_by_user_id( $user_id, $password ) }; \& if ($@) { some_error_handling(); return; } \& $session{ils_access_token} = $ils\->access_token; \& $session{ils_access_token_type} = $ils\->access_token_type; \& ... \& Somewhere else in your app: \& my $ils = WebService::ILS::Provider({ \& client_id => $client_id, \& client_secret => $client_secret, \& access_token => $session{ils_access_token}, \& access_token_type => $session{ils_access_token_type}, \& }); \& \& my $checkouts = $ils\->checkouts; .Ve .SS "Authentication at the provider" .IX Subsection "Authentication at the provider" User is redirected to the provider authentication url, and after authenticating at the provider redirected back with some kind of auth token. Requires url to handle return redirect from the provider. .PP It can be used as an alternative to \s-1FB\s0 and Google auth. .PP This is just to give an idea, specifics heavily depend on the provider .PP \fIauth_url ($redirect_back_uri)\fR .IX Subsection "auth_url ($redirect_back_uri)" .PP Returns provider authentication url to redirect to .PP \fIauth_token_param_name ()\fR .IX Subsection "auth_token_param_name ()" .PP Returns auth code url param name .PP \fIauth_by_token ($provider_token)\fR .IX Subsection "auth_by_token ($provider_token)" .PP An example: .PP .Vb 9 \& my $ils = WebService::ILS::Provider({ \& client_id => $client_id, \& client_secret => $client_secret, \& }); \& my $redirect_url = $ils\->auth_url("http://myapp.com/ils\-auth"); \& $response\->redirect($redirect_url); \& ... \& After successful authentication at the provider, provider redirects \& back to specified app url (http://myapp.com/ils\-auth) \& \& /ils\-auth handler: \& my $auth_token = $req\->param( $ils\->auth_token_param_name ) \& or some_error_handling(), return; \& local $@; \& eval { $ils\->auth_by_token( $auth_token ) }; \& if ($@) { some_error_handling(); return; } \& $session{ils_access_token} = $ils\->access_token; \& $session{ils_access_token_type} = $ils\->access_token_type; \& ... \& Somewhere else in your app: \& passing access token to the constructor as above .Ve .SH "CIRCULATION METHODS" .IX Header "CIRCULATION METHODS" .SS "patron ()" .IX Subsection "patron ()" \fIReturns patron record:\fR .IX Subsection "Returns patron record:" .ie n .IP """id""" 12 .el .IP "\f(CWid\fR" 12 .IX Item "id" .PD 0 .ie n .IP """active"" => boolean" 12 .el .IP "\f(CWactive\fR => boolean" 12 .IX Item "active => boolean" .ie n .IP """copies_available"" => number of copies available" 12 .el .IP "\f(CWcopies_available\fR => number of copies available" 12 .IX Item "copies_available => number of copies available" .ie n .IP """checkout_limit"" => number of checkouts allowed" 12 .el .IP "\f(CWcheckout_limit\fR => number of checkouts allowed" 12 .IX Item "checkout_limit => number of checkouts allowed" .ie n .IP """hold_limit"" => number of holds allowed" 12 .el .IP "\f(CWhold_limit\fR => number of holds allowed" 12 .IX Item "hold_limit => number of holds allowed" .PD .SS "holds ()" .IX Subsection "holds ()" \fIReturns holds record:\fR .IX Subsection "Returns holds record:" .ie n .IP """total"" => number of items on hold" 12 .el .IP "\f(CWtotal\fR => number of items on hold" 12 .IX Item "total => number of items on hold" .PD 0 .ie n .IP """items"" => list of individual items" 12 .el .IP "\f(CWitems\fR => list of individual items" 12 .IX Item "items => list of individual items" .PD .PP In addition to Item record fields described above, item records will have: .ie n .IP """placed_datetime"" => hold timestamp, with or without timezone" 12 .el .IP "\f(CWplaced_datetime\fR => hold timestamp, with or without timezone" 12 .IX Item "placed_datetime => hold timestamp, with or without timezone" .PD 0 .ie n .IP """queue_position"" => user's position in the waiting queue, if available" 12 .el .IP "\f(CWqueue_position\fR => user's position in the waiting queue, if available" 12 .IX Item "queue_position => user's position in the waiting queue, if available" .PD .SS "place_hold ($item_id)" .IX Subsection "place_hold ($item_id)" \fIReturns holds item record (as described above)\fR .IX Subsection "Returns holds item record (as described above)" .PP In addition, \f(CW\*(C`total\*(C'\fR field will be incorported as well. .SS "remove_hold ($item_id)" .IX Subsection "remove_hold ($item_id)" \fIReturns true to indicate success\fR .IX Subsection "Returns true to indicate success" .PP Returns true in case user does not have a hold on the item. Throws exception in case of any other failure. .SS "checkouts ()" .IX Subsection "checkouts ()" \fIReturns checkout record:\fR .IX Subsection "Returns checkout record:" .ie n .IP """total"" => number of items on hold" 12 .el .IP "\f(CWtotal\fR => number of items on hold" 12 .IX Item "total => number of items on hold" .PD 0 .ie n .IP """items"" => list of individual items" 12 .el .IP "\f(CWitems\fR => list of individual items" 12 .IX Item "items => list of individual items" .PD .PP In addition to Item record fields described above, item records will have: .ie n .IP """checkout_datetime"" => checkout timestamp, with or without timezone" 12 .el .IP "\f(CWcheckout_datetime\fR => checkout timestamp, with or without timezone" 12 .IX Item "checkout_datetime => checkout timestamp, with or without timezone" .PD 0 .ie n .IP """expires"" => date (time) checkout expires" 12 .el .IP "\f(CWexpires\fR => date (time) checkout expires" 12 .IX Item "expires => date (time) checkout expires" .ie n .IP """url"" => download/stream url" 12 .el .IP "\f(CWurl\fR => download/stream url" 12 .IX Item "url => download/stream url" .ie n .IP """files"" => an arrayref of downloadable file details title, url, size" 12 .el .IP "\f(CWfiles\fR => an arrayref of downloadable file details title, url, size" 12 .IX Item "files => an arrayref of downloadable file details title, url, size" .PD .SS "checkout ($item_id)" .IX Subsection "checkout ($item_id)" \fIReturns checkout item record (as described above)\fR .IX Subsection "Returns checkout item record (as described above)" .PP In addition, \f(CW\*(C`total\*(C'\fR field will be incorported as well. .SS "return ($item_id)" .IX Subsection "return ($item_id)" \fIReturns true to indicate success\fR .IX Subsection "Returns true to indicate success" .PP Returns true in case user does not have the item checked out. Throws exception in case of any other failure. .SH "NATIVE METHODS" .IX Header "NATIVE METHODS" All Discovery and Circulation methods (with exception of \fIremove_hold()\fR and \fIreturn()\fR, where it does not make sense) have native_*() counterparts, eg \fInative_search()\fR, \fInative_item_availability()\fR, \fInative_checkout()\fR etc. .PP In case of single item methods, \fInative_item_availability()\fR, \&\fInative_checkout()\fR etc, they take item_id as parameter. Otherwise, it's a hashref of \s-1HTTP\s0 request params (\s-1GET\s0 or \s-1POST\s0). .PP Return value is a record as returned by \s-1API.\s0 .PP Individual provider subclasses provide additional provider specific native methods. .SH "UTILITY METHODS" .IX Header "UTILITY METHODS" .SS "Error constants" .IX Subsection "Error constants" .ie n .IP """ERROR_ACCESS_TOKEN""" 4 .el .IP "\f(CWERROR_ACCESS_TOKEN\fR" 4 .IX Item "ERROR_ACCESS_TOKEN" .PD 0 .ie n .IP """ERROR_NOT_AUTHENTICATED""" 4 .el .IP "\f(CWERROR_NOT_AUTHENTICATED\fR" 4 .IX Item "ERROR_NOT_AUTHENTICATED" .PD .SS "error_message ($exception_string)" .IX Subsection "error_message ($exception_string)" \fIReturns error message probably suitable for displaying to the user\fR .IX Subsection "Returns error message probably suitable for displaying to the user" .PP Example: .PP .Vb 6 \& my $res = eval { $ils\->checkout($id) }; \& if ($@) { \& my $msg = $ils\->error_message($@); \& display($msg); \& log_error($@); \& } .Ve .SS "is_access_token_error ($exception_string)" .IX Subsection "is_access_token_error ($exception_string)" \fIReturns true if the error is access token related\fR .IX Subsection "Returns true if the error is access token related" .SS "is_not_authenticated_error ($exception_string)" .IX Subsection "is_not_authenticated_error ($exception_string)" \fIReturns true if the error is \*(L"Not authenticated\*(R"\fR .IX Subsection "Returns true if the error is Not authenticated" .SH "TODO" .IX Header "TODO" Federated search .SH "LICENSE" .IX Header "LICENSE" Copyright (C) Catalyst \s-1IT NZ\s0 Ltd Copyright (C) Bywater Solutions .PP This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. .SH "AUTHOR" .IX Header "AUTHOR" Srdjan JankoviX