80
|
|
|
|
|
|
|
=item C </td>
</tr>
<tr>
<td class="h" >
<a name="81">81</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="82">82</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<subtitle> </td>
</tr>
<tr>
<td class="h" >
<a name="83">83</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="84">84</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<description> </td>
</tr>
<tr>
<td class="h" >
<a name="85">85</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="86">86</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<author> </td>
</tr>
<tr>
<td class="h" >
<a name="87">87</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="88">88</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<publisher> </td>
</tr>
<tr>
<td class="h" >
<a name="89">89</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="90">90</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<publication_date> </td>
</tr>
<tr>
<td class="h" >
<a name="91">91</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="92">92</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<language> </td>
</tr>
<tr>
<td class="h" >
<a name="93">93</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="94">94</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<rating> => user ratings metrics </td>
</tr>
<tr>
<td class="h" >
<a name="95">95</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="96">96</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<popularity> => checkout metrics </td>
</tr>
<tr>
<td class="h" >
<a name="97">97</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="98">98</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<subjects> => subject categories (tags) </td>
</tr>
<tr>
<td class="h" >
<a name="99">99</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="100">100</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<facets> => a hashref of facet => [values] </td>
</tr>
<tr>
<td class="h" >
<a name="101">101</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="102">102</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<media> => book, e-book, video, audio etc </td>
</tr>
<tr>
<td class="h" >
<a name="103">103</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="104">104</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<formats> => an arrayref of available formats </td>
</tr>
<tr>
<td class="h" >
<a name="105">105</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="106">106</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<images> => a hashref of size => url </td>
</tr>
<tr>
<td class="h" >
<a name="107">107</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="108">108</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<encryption_key> => for decryption purposes </td>
</tr>
<tr>
<td class="h" >
<a name="109">109</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="110">110</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<drm> => subject to drm </td>
</tr>
<tr>
<td class="h" >
<a name="111">111</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="112">112</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="113">113</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="114">114</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Not all fields are available for all service providers. </td>
</tr>
<tr>
<td class="h" >
<a name="115">115</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Field values are not standardised. </td>
</tr>
<tr>
<td class="h" >
<a name="116">116</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="117">117</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="118">118</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="119">119</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#119-1">
5
</a>
</td>
<td >
</td>
<td >
669
</td>
<td class="s"> use Carp; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
230
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="120">120</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#120-1">
5
</a>
</td>
<td >
</td>
<td >
1298
</td>
<td class="s"> use Hash::Merge; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
9052
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
253
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="121">121</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#121-1">
5
</a>
</td>
<td >
</td>
<td >
1585
</td>
<td class="s"> use Params::Check; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
14107
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
252
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="122">122</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#122-1">
5
</a>
</td>
<td >
</td>
<td >
2124
</td>
<td class="s"> use LWP::UserAgent; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
90374
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
169
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="123">123</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#123-1">
5
</a>
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> use HTTP::Status qw(:constants); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
1643
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="124">124</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#124-1">
5
</a>
</td>
<td >
</td>
<td >
1505
</td>
<td class="s"> use MIME::Base64 qw(); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2404
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
148
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="125">125</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#125-1">
5
</a>
</td>
<td >
</td>
<td >
389
</td>
<td class="s"> use JSON qw(from_json); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5152
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
31
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="126">126</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="127">127</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> our $DEBUG; </td>
</tr>
<tr>
<td class="h" >
<a name="128">128</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="129">129</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my %CONSTRUCTOR_PARAMS_SPEC; </td>
</tr>
<tr>
<td class="h" >
<a name="130">130</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _set_param_spec { </td>
</tr>
<tr>
<td class="h" >
<a name="131">131</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#131-1">
14
</a>
</td>
<td >
</td>
<td >
39
</td>
<td class="s"> my $class = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="132">132</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
25
</td>
<td class="s"> my $param_spec = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="133">133</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="134">134</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> $CONSTRUCTOR_PARAMS_SPEC{$class} = $param_spec; </td>
</tr>
<tr>
<td class="h" >
<a name="135">135</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="136">136</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _get_param_spec { </td>
</tr>
<tr>
<td class="h" >
<a name="137">137</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#137-1">
2
</a>
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $class = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="138">138</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#138-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> if (my $ref = ref($class)) { </td>
</tr>
<tr>
<td class="h" >
<a name="139">139</a>
</td>
<td class="c0" >
<a href="#145">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $class = $ref; </td>
</tr>
<tr>
<td class="h" >
<a name="140">140</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="141">141</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="142">142</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> my $p_s = $CONSTRUCTOR_PARAMS_SPEC{$class}; </td>
</tr>
<tr>
<td class="h" >
<a name="143">143</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#143-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> return $p_s if $class eq __PACKAGE__; </td>
</tr>
<tr>
<td class="h" >
<a name="144">144</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="145">145</a>
</td>
<td class="c0" >
<a href="#146">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> (my $superclass = $class) =~ s/::\w+$//o; </td>
</tr>
<tr>
<td class="h" >
<a name="146">146</a>
</td>
<td class="c0" >
<a href="#319">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#146-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return Hash::Merge::merge($p_s || {}, $superclass->_get_param_spec); </td>
</tr>
<tr>
<td class="h" >
<a name="147">147</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="148">148</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="149">149</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 CONSTRUCTOR </td>
</tr>
<tr>
<td class="h" >
<a name="150">150</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="151">151</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 new (%params_hash or $params_hashref) </td>
</tr>
<tr>
<td class="h" >
<a name="152">152</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="153">153</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Client (vendor) related constructor params, given by service provider: </td>
</tr>
<tr>
<td class="h" >
<a name="154">154</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="155">155</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="156">156</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="157">157</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<client_id> => client (vendor) identifier </td>
</tr>
<tr>
<td class="h" >
<a name="158">158</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="159">159</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<client_secret> => secret key (password) </td>
</tr>
<tr>
<td class="h" >
<a name="160">160</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="161">161</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<library_id> => sometimes service providers provide access </td>
</tr>
<tr>
<td class="h" >
<a name="162">162</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to differnt "libraries" </td>
</tr>
<tr>
<td class="h" >
<a name="163">163</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="164">164</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="165">165</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="166">166</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 General constructor params: </td>
</tr>
<tr>
<td class="h" >
<a name="167">167</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="168">168</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="169">169</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="170">170</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<user_agent> => LWP::UserAgent or a derivative; </td>
</tr>
<tr>
<td class="h" >
<a name="171">171</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> usually not needed, one is created for you. </td>
</tr>
<tr>
<td class="h" >
<a name="172">172</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="173">173</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<user_agent_params> => LWP::UserAgent constructor params </td>
</tr>
<tr>
<td class="h" >
<a name="174">174</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> so you don't need to create user agent yourself </td>
</tr>
<tr>
<td class="h" >
<a name="175">175</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="176">176</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<access_token> => as returned from the provider authentication system </td>
</tr>
<tr>
<td class="h" >
<a name="177">177</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="178">178</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<access_token_type> => as returned from the provider authentication system </td>
</tr>
<tr>
<td class="h" >
<a name="179">179</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="180">180</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="181">181</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="182">182</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> These are also read-only attributes </td>
</tr>
<tr>
<td class="h" >
<a name="183">183</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="184">184</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Not all of client/library params are required for all service providers. </td>
</tr>
<tr>
<td class="h" >
<a name="185">185</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="186">186</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="187">187</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="188">188</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> use Class::Tiny qw( </td>
</tr>
<tr>
<td class="h" >
<a name="189">189</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> user_agent </td>
</tr>
<tr>
<td class="h" >
<a name="190">190</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_id client_secret library_id </td>
</tr>
<tr>
<td class="h" >
<a name="191">191</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> access_token access_token_type </td>
</tr>
<tr>
<td class="h" >
<a name="192">192</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#192-1">
5
</a>
</td>
<td >
</td>
<td >
2606
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6327
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="193">193</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="194">194</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> __PACKAGE__->_set_param_spec({ </td>
</tr>
<tr>
<td class="h" >
<a name="195">195</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_id => { required => 1, defined => 1 }, </td>
</tr>
<tr>
<td class="h" >
<a name="196">196</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_secret => { required => 1, defined => 1 }, </td>
</tr>
<tr>
<td class="h" >
<a name="197">197</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> library_id => { required => 0, defined => 1 }, </td>
</tr>
<tr>
<td class="h" >
<a name="198">198</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> access_token => { required => 0 }, </td>
</tr>
<tr>
<td class="h" >
<a name="199">199</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> access_token_type => { required => 0 }, </td>
</tr>
<tr>
<td class="h" >
<a name="200">200</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> user_agent => { required => 0 }, </td>
</tr>
<tr>
<td class="h" >
<a name="201">201</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> user_agent_params => { required => 0 }, </td>
</tr>
<tr>
<td class="h" >
<a name="202">202</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }); </td>
</tr>
<tr>
<td class="h" >
<a name="203">203</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="204">204</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub BUILDARGS { </td>
</tr>
<tr>
<td class="h" >
<a name="205">205</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#205-1">
2
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#205-1">
0
</a>
</td>
<td >
757
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="206">206</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#206-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> my $params = shift || {}; </td>
</tr>
<tr>
<td class="h" >
<a name="207">207</a>
</td>
<td class="c3" >
2
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--branch.html#207-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> if (!ref( $params )) { </td>
</tr>
<tr>
<td class="h" >
<a name="208">208</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $params = {$params, @_}; </td>
</tr>
<tr>
<td class="h" >
<a name="209">209</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="210">210</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="211">211</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> local $Params::Check::WARNINGS_FATAL = 1; </td>
</tr>
<tr>
<td class="h" >
<a name="212">212</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#212-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> $params = Params::Check::check($self->_get_param_spec, $params) </td>
</tr>
<tr>
<td class="h" >
<a name="213">213</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or croak "Invalid parameters: ".Params::Check::last_error(); </td>
</tr>
<tr>
<td class="h" >
<a name="214">214</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
236
</td>
<td class="s"> return $params; </td>
</tr>
<tr>
<td class="h" >
<a name="215">215</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="216">216</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="217">217</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub BUILD { </td>
</tr>
<tr>
<td class="h" >
<a name="218">218</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#218-1">
2
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#218-1">
0
</a>
</td>
<td >
34
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="219">219</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $params = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="220">220</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="221">221</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#221-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> my $ua_params = delete $params->{user_agent_params} || {}; </td>
</tr>
<tr>
<td class="h" >
<a name="222">222</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#222-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> $self->user_agent( LWP::UserAgent->new(%$ua_params) ) unless $self->user_agent; </td>
</tr>
<tr>
<td class="h" >
<a name="223">223</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2112
</td>
<td class="s"> delete $self->{user_agent_params}; </td>
</tr>
<tr>
<td class="h" >
<a name="224">224</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="225">225</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="226">226</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 ATTRIBUTES </td>
</tr>
<tr>
<td class="h" >
<a name="227">227</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="228">228</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 user_agent </td>
</tr>
<tr>
<td class="h" >
<a name="229">229</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="230">230</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> As provided to constructor, or auto created. Useful if one wants to </td>
</tr>
<tr>
<td class="h" >
<a name="231">231</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> change user agent attributes on the fly, eg </td>
</tr>
<tr>
<td class="h" >
<a name="232">232</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="233">233</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $ils->user_agent->timeout(120); </td>
</tr>
<tr>
<td class="h" >
<a name="234">234</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="235">235</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 DISCOVERY METHODS </td>
</tr>
<tr>
<td class="h" >
<a name="236">236</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="237">237</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 search ($params_hashref) </td>
</tr>
<tr>
<td class="h" >
<a name="238">238</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="239">239</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Input params: </td>
</tr>
<tr>
<td class="h" >
<a name="240">240</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="241">241</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="242">242</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="243">243</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<query> => query (search) string </td>
</tr>
<tr>
<td class="h" >
<a name="244">244</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="245">245</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<page_size> => number of items per results page </td>
</tr>
<tr>
<td class="h" >
<a name="246">246</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="247">247</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<page> => wanted page number </td>
</tr>
<tr>
<td class="h" >
<a name="248">248</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="249">249</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<sort> => resultset sort option (see below) </td>
</tr>
<tr>
<td class="h" >
<a name="250">250</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="251">251</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="252">252</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="253">253</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Sort options are either an array or a comma separated string of options: </td>
</tr>
<tr>
<td class="h" >
<a name="254">254</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="255">255</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="256">256</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="257">257</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<publication_date> => date title was published </td>
</tr>
<tr>
<td class="h" >
<a name="258">258</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="259">259</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<available_date> => date title became available for users </td>
</tr>
<tr>
<td class="h" >
<a name="260">260</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="261">261</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<rating> => number of items per results page </td>
</tr>
<tr>
<td class="h" >
<a name="262">262</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="263">263</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="264">264</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="265">265</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Sort order can be added after option with ":", eg </td>
</tr>
<tr>
<td class="h" >
<a name="266">266</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> "publication_date:desc,rating:desc" </td>
</tr>
<tr>
<td class="h" >
<a name="267">267</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="268">268</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns search results record: </td>
</tr>
<tr>
<td class="h" >
<a name="269">269</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="270">270</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="271">271</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="272">272</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<items> => an array of item records </td>
</tr>
<tr>
<td class="h" >
<a name="273">273</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="274">274</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<page_size> => number of items per results page </td>
</tr>
<tr>
<td class="h" >
<a name="275">275</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="276">276</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<page> => results page number </td>
</tr>
<tr>
<td class="h" >
<a name="277">277</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="278">278</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<pages> => total number of pages </td>
</tr>
<tr>
<td class="h" >
<a name="279">279</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="280">280</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<total> => total number of items found by the search </td>
</tr>
<tr>
<td class="h" >
<a name="281">281</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="282">282</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="283">283</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="284">284</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 item_metadata ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="285">285</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="286">286</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns item record </td>
</tr>
<tr>
<td class="h" >
<a name="287">287</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="288">288</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 item_availability ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="289">289</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="290">290</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns item availability record: </td>
</tr>
<tr>
<td class="h" >
<a name="291">291</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="292">292</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="293">293</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="294">294</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<id> </td>
</tr>
<tr>
<td class="h" >
<a name="295">295</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="296">296</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<available> => boolean </td>
</tr>
<tr>
<td class="h" >
<a name="297">297</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="298">298</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<copies_available> => number of copies available </td>
</tr>
<tr>
<td class="h" >
<a name="299">299</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="300">300</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<copies_owned> => number of copies owned </td>
</tr>
<tr>
<td class="h" >
<a name="301">301</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="302">302</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<type> => availability type, provider dependant </td>
</tr>
<tr>
<td class="h" >
<a name="303">303</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="304">304</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="305">305</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="306">306</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Not all fields are available for all service providers. </td>
</tr>
<tr>
<td class="h" >
<a name="307">307</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For example, some will provide "copies_available", making "available" </td>
</tr>
<tr>
<td class="h" >
<a name="308">308</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> redundant, whereas others will just provide "available". </td>
</tr>
<tr>
<td class="h" >
<a name="309">309</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="310">310</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 is_item_available ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="311">311</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="312">312</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns boolean </td>
</tr>
<tr>
<td class="h" >
<a name="313">313</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="314">314</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Simplified version of L<item_availability()> </td>
</tr>
<tr>
<td class="h" >
<a name="315">315</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="316">316</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="317">317</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="318">318</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub search { </td>
</tr>
<tr>
<td class="h" >
<a name="319">319</a>
</td>
<td class="c0" >
<a href="#324">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#319-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#319-1">
1
</a>
</td>
<td >
</td>
<td class="s"> die "search() not implemented"; </td>
</tr>
<tr>
<td class="h" >
<a name="320">320</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="321">321</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="322">322</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # relevancy availability available_date title author popularity rating price publisher publication_date </td>
</tr>
<tr>
<td class="h" >
<a name="323">323</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _parse_sort_string { </td>
</tr>
<tr>
<td class="h" >
<a name="324">324</a>
</td>
<td class="c0" >
<a href="#325">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#324-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="325">325</a>
</td>
<td class="c0" >
<a href="#326">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#325-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $sort = shift or croak "No sort options"; </td>
</tr>
<tr>
<td class="h" >
<a name="326">326</a>
</td>
<td class="c0" >
<a href="#327">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#326-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $xlate_table = shift || {}; </td>
</tr>
<tr>
<td class="h" >
<a name="327">327</a>
</td>
<td class="c0" >
<a href="#329">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $camelise = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="328">328</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="329">329</a>
</td>
<td class="c0" >
<a href="#331">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#329-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $sort = [split /\s*,\s*/, $sort] unless ref $sort; </td>
</tr>
<tr>
<td class="h" >
<a name="330">330</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="331">331</a>
</td>
<td class="c0" >
<a href="#332">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> foreach (@$sort) { </td>
</tr>
<tr>
<td class="h" >
<a name="332">332</a>
</td>
<td class="c0" >
<a href="#333">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($s,$d) = split ':'; </td>
</tr>
<tr>
<td class="h" >
<a name="333">333</a>
</td>
<td class="c0" >
<a href="#334">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#333-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if (exists $xlate_table->{$s}) { </td>
</tr>
<tr>
<td class="h" >
<a name="334">334</a>
</td>
<td class="c0" >
<a href="#335">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#334-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> next unless $xlate_table->{$s}; </td>
</tr>
<tr>
<td class="h" >
<a name="335">335</a>
</td>
<td class="c0" >
<a href="#338">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $_ = $xlate_table->{$s}; </td>
</tr>
<tr>
<td class="h" >
<a name="336">336</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="337">337</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> else { </td>
</tr>
<tr>
<td class="h" >
<a name="338">338</a>
</td>
<td class="c0" >
<a href="#341">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $_ = $s; </td>
</tr>
<tr>
<td class="h" >
<a name="339">339</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="340">340</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # join('', map{ ucfirst $_ } split(/(?<=[A-Za-z])_(?=[A-Za-z])|\b/, $s)); </td>
</tr>
<tr>
<td class="h" >
<a name="341">341</a>
</td>
<td class="c0" >
<a href="#342">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#341-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $_ = join '', map ucfirst, split /(?<=[A-Za-z])_(?=[A-Za-z])|\b/ if $camelise; </td>
</tr>
<tr>
<td class="h" >
<a name="342">342</a>
</td>
<td class="c0" >
<a href="#345">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#342-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $_ = "$_:$d" if $d; </td>
</tr>
<tr>
<td class="h" >
<a name="343">343</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="344">344</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="345">345</a>
</td>
<td class="c0" >
<a href="#349">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $sort; </td>
</tr>
<tr>
<td class="h" >
<a name="346">346</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="347">347</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="348">348</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub item_metadata { </td>
</tr>
<tr>
<td class="h" >
<a name="349">349</a>
</td>
<td class="c0" >
<a href="#353">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#349-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#349-1">
1
</a>
</td>
<td >
</td>
<td class="s"> die "item_metadata() not implemented"; </td>
</tr>
<tr>
<td class="h" >
<a name="350">350</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="351">351</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="352">352</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub item_availability { </td>
</tr>
<tr>
<td class="h" >
<a name="353">353</a>
</td>
<td class="c0" >
<a href="#564">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#353-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#353-1">
1
</a>
</td>
<td >
</td>
<td class="s"> die "item_availability() not implemented"; </td>
</tr>
<tr>
<td class="h" >
<a name="354">354</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="355">355</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="356">356</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 INDIVIDUAL USER AUTHENTICATION AND METHODS </td>
</tr>
<tr>
<td class="h" >
<a name="357">357</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="358">358</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 user_id / password </td>
</tr>
<tr>
<td class="h" >
<a name="359">359</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="360">360</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Provider authentication API is used to get an authorized session. </td>
</tr>
<tr>
<td class="h" >
<a name="361">361</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="362">362</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 auth_by_user_id($user_id, $password) </td>
</tr>
<tr>
<td class="h" >
<a name="363">363</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="364">364</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> An example: </td>
</tr>
<tr>
<td class="h" >
<a name="365">365</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="366">366</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $ils = WebService::ILS::Provider({ </td>
</tr>
<tr>
<td class="h" >
<a name="367">367</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_id => $client_id, </td>
</tr>
<tr>
<td class="h" >
<a name="368">368</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_secret => $client_secret, </td>
</tr>
<tr>
<td class="h" >
<a name="369">369</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }); </td>
</tr>
<tr>
<td class="h" >
<a name="370">370</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> eval { $ils->auth_by_user_id( $user_id, $password ) }; </td>
</tr>
<tr>
<td class="h" >
<a name="371">371</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if ($@) { some_error_handling(); return; } </td>
</tr>
<tr>
<td class="h" >
<a name="372">372</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $session{ils_access_token} = $ils->access_token; </td>
</tr>
<tr>
<td class="h" >
<a name="373">373</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $session{ils_access_token_type} = $ils->access_token_type; </td>
</tr>
<tr>
<td class="h" >
<a name="374">374</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ... </td>
</tr>
<tr>
<td class="h" >
<a name="375">375</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Somewhere else in your app: </td>
</tr>
<tr>
<td class="h" >
<a name="376">376</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $ils = WebService::ILS::Provider({ </td>
</tr>
<tr>
<td class="h" >
<a name="377">377</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_id => $client_id, </td>
</tr>
<tr>
<td class="h" >
<a name="378">378</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_secret => $client_secret, </td>
</tr>
<tr>
<td class="h" >
<a name="379">379</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> access_token => $session{ils_access_token}, </td>
</tr>
<tr>
<td class="h" >
<a name="380">380</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> access_token_type => $session{ils_access_token_type}, </td>
</tr>
<tr>
<td class="h" >
<a name="381">381</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }); </td>
</tr>
<tr>
<td class="h" >
<a name="382">382</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="383">383</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $checkouts = $ils->checkouts; </td>
</tr>
<tr>
<td class="h" >
<a name="384">384</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="385">385</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 Authentication at the provider </td>
</tr>
<tr>
<td class="h" >
<a name="386">386</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="387">387</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> User is redirected to the provider authentication url, and after </td>
</tr>
<tr>
<td class="h" >
<a name="388">388</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> authenticating at the provider redirected back with some kind of auth token. </td>
</tr>
<tr>
<td class="h" >
<a name="389">389</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Requires url to handle return redirect from the provider. </td>
</tr>
<tr>
<td class="h" >
<a name="390">390</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="391">391</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> It can be used as an alternative to FB and Google auth. </td>
</tr>
<tr>
<td class="h" >
<a name="392">392</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="393">393</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This is just to give an idea, specifics heavily depend on the provider </td>
</tr>
<tr>
<td class="h" >
<a name="394">394</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="395">395</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 auth_url ($redirect_back_uri) </td>
</tr>
<tr>
<td class="h" >
<a name="396">396</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="397">397</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns provider authentication url to redirect to </td>
</tr>
<tr>
<td class="h" >
<a name="398">398</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="399">399</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 auth_token_param_name () </td>
</tr>
<tr>
<td class="h" >
<a name="400">400</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="401">401</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns auth code url param name </td>
</tr>
<tr>
<td class="h" >
<a name="402">402</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="403">403</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 auth_by_token ($provider_token) </td>
</tr>
<tr>
<td class="h" >
<a name="404">404</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="405">405</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> An example: </td>
</tr>
<tr>
<td class="h" >
<a name="406">406</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="407">407</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $ils = WebService::ILS::Provider({ </td>
</tr>
<tr>
<td class="h" >
<a name="408">408</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_id => $client_id, </td>
</tr>
<tr>
<td class="h" >
<a name="409">409</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> client_secret => $client_secret, </td>
</tr>
<tr>
<td class="h" >
<a name="410">410</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }); </td>
</tr>
<tr>
<td class="h" >
<a name="411">411</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $redirect_url = $ils->auth_url("http://myapp.com/ils-auth"); </td>
</tr>
<tr>
<td class="h" >
<a name="412">412</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $response->redirect($redirect_url); </td>
</tr>
<tr>
<td class="h" >
<a name="413">413</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ... </td>
</tr>
<tr>
<td class="h" >
<a name="414">414</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> After successful authentication at the provider, provider redirects </td>
</tr>
<tr>
<td class="h" >
<a name="415">415</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> back to specified app url (http://myapp.com/ils-auth) </td>
</tr>
<tr>
<td class="h" >
<a name="416">416</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="417">417</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> /ils-auth handler: </td>
</tr>
<tr>
<td class="h" >
<a name="418">418</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $auth_token = $req->param( $ils->auth_token_param_name ) </td>
</tr>
<tr>
<td class="h" >
<a name="419">419</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or some_error_handling(), return; </td>
</tr>
<tr>
<td class="h" >
<a name="420">420</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> local $@; </td>
</tr>
<tr>
<td class="h" >
<a name="421">421</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> eval { $ils->auth_by_token( $auth_token ) }; </td>
</tr>
<tr>
<td class="h" >
<a name="422">422</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if ($@) { some_error_handling(); return; } </td>
</tr>
<tr>
<td class="h" >
<a name="423">423</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $session{ils_access_token} = $ils->access_token; </td>
</tr>
<tr>
<td class="h" >
<a name="424">424</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $session{ils_access_token_type} = $ils->access_token_type; </td>
</tr>
<tr>
<td class="h" >
<a name="425">425</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ... </td>
</tr>
<tr>
<td class="h" >
<a name="426">426</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Somewhere else in your app: </td>
</tr>
<tr>
<td class="h" >
<a name="427">427</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> passing access token to the constructor as above </td>
</tr>
<tr>
<td class="h" >
<a name="428">428</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="429">429</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="430">430</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="431">431</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 CIRCULATION METHODS </td>
</tr>
<tr>
<td class="h" >
<a name="432">432</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="433">433</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 patron () </td>
</tr>
<tr>
<td class="h" >
<a name="434">434</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="435">435</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns patron record: </td>
</tr>
<tr>
<td class="h" >
<a name="436">436</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="437">437</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="438">438</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="439">439</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<id> </td>
</tr>
<tr>
<td class="h" >
<a name="440">440</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="441">441</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<active> => boolean </td>
</tr>
<tr>
<td class="h" >
<a name="442">442</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="443">443</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<copies_available> => number of copies available </td>
</tr>
<tr>
<td class="h" >
<a name="444">444</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="445">445</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<checkout_limit> => number of checkouts allowed </td>
</tr>
<tr>
<td class="h" >
<a name="446">446</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="447">447</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<hold_limit> => number of holds allowed </td>
</tr>
<tr>
<td class="h" >
<a name="448">448</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="449">449</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="450">450</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="451">451</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 holds () </td>
</tr>
<tr>
<td class="h" >
<a name="452">452</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="453">453</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns holds record: </td>
</tr>
<tr>
<td class="h" >
<a name="454">454</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="455">455</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="456">456</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="457">457</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<total> => number of items on hold </td>
</tr>
<tr>
<td class="h" >
<a name="458">458</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="459">459</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<items> => list of individual items </td>
</tr>
<tr>
<td class="h" >
<a name="460">460</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="461">461</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="462">462</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="463">463</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In addition to Item record fields described above, </td>
</tr>
<tr>
<td class="h" >
<a name="464">464</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> item records will have: </td>
</tr>
<tr>
<td class="h" >
<a name="465">465</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="466">466</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="467">467</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="468">468</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<placed_datetime> => hold timestamp, with or without timezone </td>
</tr>
<tr>
<td class="h" >
<a name="469">469</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="470">470</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<queue_position> => user's position in the waiting queue, </td>
</tr>
<tr>
<td class="h" >
<a name="471">471</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if available </td>
</tr>
<tr>
<td class="h" >
<a name="472">472</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="473">473</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="474">474</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="475">475</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 place_hold ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="476">476</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="477">477</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns holds item record (as described above) </td>
</tr>
<tr>
<td class="h" >
<a name="478">478</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="479">479</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In addition, C<total> field will be incorported as well. </td>
</tr>
<tr>
<td class="h" >
<a name="480">480</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="481">481</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 remove_hold ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="482">482</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="483">483</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns true to indicate success </td>
</tr>
<tr>
<td class="h" >
<a name="484">484</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="485">485</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns true in case user does not have a hold on the item. </td>
</tr>
<tr>
<td class="h" >
<a name="486">486</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Throws exception in case of any other failure. </td>
</tr>
<tr>
<td class="h" >
<a name="487">487</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="488">488</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 checkouts () </td>
</tr>
<tr>
<td class="h" >
<a name="489">489</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="490">490</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns checkout record: </td>
</tr>
<tr>
<td class="h" >
<a name="491">491</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="492">492</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="493">493</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="494">494</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<total> => number of items on hold </td>
</tr>
<tr>
<td class="h" >
<a name="495">495</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="496">496</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<items> => list of individual items </td>
</tr>
<tr>
<td class="h" >
<a name="497">497</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="498">498</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="499">499</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="500">500</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In addition to Item record fields described above, </td>
</tr>
<tr>
<td class="h" >
<a name="501">501</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> item records will have: </td>
</tr>
<tr>
<td class="h" >
<a name="502">502</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="503">503</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 12 </td>
</tr>
<tr>
<td class="h" >
<a name="504">504</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="505">505</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<checkout_datetime> => checkout timestamp, with or without timezone </td>
</tr>
<tr>
<td class="h" >
<a name="506">506</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="507">507</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<expires> => date (time) checkout expires </td>
</tr>
<tr>
<td class="h" >
<a name="508">508</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="509">509</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<url> => download/stream url </td>
</tr>
<tr>
<td class="h" >
<a name="510">510</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="511">511</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<files> => an arrayref of downloadable file details </td>
</tr>
<tr>
<td class="h" >
<a name="512">512</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> title, url, size </td>
</tr>
<tr>
<td class="h" >
<a name="513">513</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="514">514</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="515">515</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="516">516</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 checkout ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="517">517</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="518">518</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns checkout item record (as described above) </td>
</tr>
<tr>
<td class="h" >
<a name="519">519</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="520">520</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In addition, C<total> field will be incorported as well. </td>
</tr>
<tr>
<td class="h" >
<a name="521">521</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="522">522</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 return ($item_id) </td>
</tr>
<tr>
<td class="h" >
<a name="523">523</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="524">524</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns true to indicate success </td>
</tr>
<tr>
<td class="h" >
<a name="525">525</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="526">526</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns true in case user does not have the item checked out. </td>
</tr>
<tr>
<td class="h" >
<a name="527">527</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Throws exception in case of any other failure. </td>
</tr>
<tr>
<td class="h" >
<a name="528">528</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="529">529</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="530">530</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="531">531</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 NATIVE METHODS </td>
</tr>
<tr>
<td class="h" >
<a name="532">532</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="533">533</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> All Discovery and Circulation methods (with exception of remove_hold() </td>
</tr>
<tr>
<td class="h" >
<a name="534">534</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and return(), where it does not make sense) have native_*() counterparts, </td>
</tr>
<tr>
<td class="h" >
<a name="535">535</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> eg native_search(), native_item_availability(), native_checkout() etc. </td>
</tr>
<tr>
<td class="h" >
<a name="536">536</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="537">537</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In case of single item methods, native_item_availability(), </td>
</tr>
<tr>
<td class="h" >
<a name="538">538</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> native_checkout() etc, they take item_id as parameter. Otherwise, it's a </td>
</tr>
<tr>
<td class="h" >
<a name="539">539</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> hashref of HTTP request params (GET or POST). </td>
</tr>
<tr>
<td class="h" >
<a name="540">540</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="541">541</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Return value is a record as returned by API. </td>
</tr>
<tr>
<td class="h" >
<a name="542">542</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="543">543</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Individual provider subclasses provide additional provider specific </td>
</tr>
<tr>
<td class="h" >
<a name="544">544</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> native methods. </td>
</tr>
<tr>
<td class="h" >
<a name="545">545</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="546">546</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 UTILITY METHODS </td>
</tr>
<tr>
<td class="h" >
<a name="547">547</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="548">548</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 Error constants </td>
</tr>
<tr>
<td class="h" >
<a name="549">549</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="550">550</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 4 </td>
</tr>
<tr>
<td class="h" >
<a name="551">551</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="552">552</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<ERROR_ACCESS_TOKEN> </td>
</tr>
<tr>
<td class="h" >
<a name="553">553</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="554">554</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<ERROR_NOT_AUTHENTICATED> </td>
</tr>
<tr>
<td class="h" >
<a name="555">555</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="556">556</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="557">557</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="558">558</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="559">559</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="560">560</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#560-1">
5
</a>
</td>
<td >
</td>
<td >
5863
</td>
<td class="s"> use constant ERROR_ACCESS_TOKEN => "Error: Authorization Failed"; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
297
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="561">561</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#561-1">
5
</a>
</td>
<td >
</td>
<td >
26
</td>
<td class="s"> use constant ERROR_NOT_AUTHENTICATED => "Error: User Not Authenticated"; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5773
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="562">562</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="563">563</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub invalid_response_exception_string { </td>
</tr>
<tr>
<td class="h" >
<a name="564">564</a>
</td>
<td class="c0" >
<a href="#565">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#564-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#564-1">
0
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="565">565</a>
</td>
<td class="c0" >
<a href="#567">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="566">566</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="567">567</a>
</td>
<td class="c0" >
<a href="#575">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return join "\n", </td>
</tr>
<tr>
<td class="h" >
<a name="568">568</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $response->message, </td>
</tr>
<tr>
<td class="h" >
<a name="569">569</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> "Request:" => $response->request->as_string, </td>
</tr>
<tr>
<td class="h" >
<a name="570">570</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> "Response:" => $response->as_string </td>
</tr>
<tr>
<td class="h" >
<a name="571">571</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ; </td>
</tr>
<tr>
<td class="h" >
<a name="572">572</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="573">573</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="574">574</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub check_response { </td>
</tr>
<tr>
<td class="h" >
<a name="575">575</a>
</td>
<td class="c0" >
<a href="#576">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#575-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#575-1">
0
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="576">576</a>
</td>
<td class="c0" >
<a href="#578">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="577">577</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="578">578</a>
</td>
<td class="c0" >
<a href="#605">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#578-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die $self->invalid_response_exception_string($response) unless $response->is_success; </td>
</tr>
<tr>
<td class="h" >
<a name="579">579</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="580">580</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="581">581</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 error_message ($exception_string) </td>
</tr>
<tr>
<td class="h" >
<a name="582">582</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="583">583</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns error message probably suitable for displaying to the user </td>
</tr>
<tr>
<td class="h" >
<a name="584">584</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="585">585</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Example: </td>
</tr>
<tr>
<td class="h" >
<a name="586">586</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="587">587</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $res = eval { $ils->checkout($id) }; </td>
</tr>
<tr>
<td class="h" >
<a name="588">588</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if ($@) { </td>
</tr>
<tr>
<td class="h" >
<a name="589">589</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $msg = $ils->error_message($@); </td>
</tr>
<tr>
<td class="h" >
<a name="590">590</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> display($msg); </td>
</tr>
<tr>
<td class="h" >
<a name="591">591</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> log_error($@); </td>
</tr>
<tr>
<td class="h" >
<a name="592">592</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="593">593</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="594">594</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 is_access_token_error ($exception_string) </td>
</tr>
<tr>
<td class="h" >
<a name="595">595</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="596">596</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns true if the error is access token related </td>
</tr>
<tr>
<td class="h" >
<a name="597">597</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="598">598</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head2 is_not_authenticated_error ($exception_string) </td>
</tr>
<tr>
<td class="h" >
<a name="599">599</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="600">600</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head3 Returns true if the error is "Not authenticated" </td>
</tr>
<tr>
<td class="h" >
<a name="601">601</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="602">602</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="603">603</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="604">604</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub error_message { </td>
</tr>
<tr>
<td class="h" >
<a name="605">605</a>
</td>
<td class="c0" >
<a href="#606">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#605-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#605-1">
1
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="606">606</a>
</td>
<td class="c0" >
<a href="#607">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#606-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $die_string = shift or return; </td>
</tr>
<tr>
<td class="h" >
<a name="607">607</a>
</td>
<td class="c0" >
<a href="#608">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $die_string =~ m/(.*?)\n/o; </td>
</tr>
<tr>
<td class="h" >
<a name="608">608</a>
</td>
<td class="c0" >
<a href="#609">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#608-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (my $msg = $1 || $die_string) =~ s! at /.* line \d+\.$!!; </td>
</tr>
<tr>
<td class="h" >
<a name="609">609</a>
</td>
<td class="c0" >
<a href="#613">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $msg; </td>
</tr>
<tr>
<td class="h" >
<a name="610">610</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="611">611</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="612">612</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub is_access_token_error { </td>
</tr>
<tr>
<td class="h" >
<a name="613">613</a>
</td>
<td class="c0" >
<a href="#614">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#613-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#613-1">
1
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="614">614</a>
</td>
<td class="c0" >
<a href="#615">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#614-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $die_string = shift or croak "No error message"; </td>
</tr>
<tr>
<td class="h" >
<a name="615">615</a>
</td>
<td class="c0" >
<a href="#619">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->error_message($die_string) eq ERROR_ACCESS_TOKEN; </td>
</tr>
<tr>
<td class="h" >
<a name="616">616</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="617">617</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="618">618</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub is_not_authenticated_error { </td>
</tr>
<tr>
<td class="h" >
<a name="619">619</a>
</td>
<td class="c0" >
<a href="#620">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#619-1">
0
</a>
</td>
<td class="c3" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#619-1">
1
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="620">620</a>
</td>
<td class="c0" >
<a href="#621">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#620-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $die_string = shift or croak "No error message"; </td>
</tr>
<tr>
<td class="h" >
<a name="621">621</a>
</td>
<td class="c0" >
<a href="#627">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->error_message($die_string) eq ERROR_NOT_AUTHENTICATED; </td>
</tr>
<tr>
<td class="h" >
<a name="622">622</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="623">623</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="624">624</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Client access authorization </td>
</tr>
<tr>
<td class="h" >
<a name="625">625</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # </td>
</tr>
<tr>
<td class="h" >
<a name="626">626</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _request_with_auth { </td>
</tr>
<tr>
<td class="h" >
<a name="627">627</a>
</td>
<td class="c0" >
<a href="#628">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#627-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="628">628</a>
</td>
<td class="c0" >
<a href="#630">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#628-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $request = shift or croak "No request"; </td>
</tr>
<tr>
<td class="h" >
<a name="629">629</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="630">630</a>
</td>
<td class="c0" >
<a href="#631">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $has_token = $self->access_token; </td>
</tr>
<tr>
<td class="h" >
<a name="631">631</a>
</td>
<td class="c0" >
<a href="#633">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = $self->_request_with_token($request); </td>
</tr>
<tr>
<td class="h" >
<a name="632">632</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # token expired? </td>
</tr>
<tr>
<td class="h" >
<a name="633">633</a>
</td>
<td class="c0" >
<a href="#635">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#633-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#633-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $response = $self->_request_with_token($request, "FRESH TOKEN") </td>
</tr>
<tr>
<td class="h" >
<a name="634">634</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $response->code == HTTP_UNAUTHORIZED && $has_token; </td>
</tr>
<tr>
<td class="h" >
<a name="635">635</a>
</td>
<td class="c0" >
<a href="#639">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $response; </td>
</tr>
<tr>
<td class="h" >
<a name="636">636</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="637">637</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="638">638</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub make_access_token_request { </td>
</tr>
<tr>
<td class="h" >
<a name="639">639</a>
</td>
<td class="c0" >
<a href="#643">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#639-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#639-1">
0
</a>
</td>
<td >
</td>
<td class="s"> die "make_access_token_request() not implemented"; </td>
</tr>
<tr>
<td class="h" >
<a name="640">640</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="641">641</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="642">642</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _request_access_token { </td>
</tr>
<tr>
<td class="h" >
<a name="643">643</a>
</td>
<td class="c0" >
<a href="#644">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#643-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="644">644</a>
</td>
<td class="c0" >
<a href="#646">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#644-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $request = shift or croak "No request"; </td>
</tr>
<tr>
<td class="h" >
<a name="645">645</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="646">646</a>
</td>
<td class="c0" >
<a href="#650">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $request->header( </td>
</tr>
<tr>
<td class="h" >
<a name="647">647</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Authorization => "Basic " . $self->_access_auth_string </td>
</tr>
<tr>
<td class="h" >
<a name="648">648</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a name="649">649</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="650">650</a>
</td>
<td class="c0" >
<a href="#655">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = $self->user_agent->request( $request ); </td>
</tr>
<tr>
<td class="h" >
<a name="651">651</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # XXX check content type </td>
</tr>
<tr>
<td class="h" >
<a name="652">652</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->process_json_response( </td>
</tr>
<tr>
<td class="h" >
<a name="653">653</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $response, </td>
</tr>
<tr>
<td class="h" >
<a name="654">654</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub { </td>
</tr>
<tr>
<td class="h" >
<a name="655">655</a>
</td>
<td class="c0" >
<a href="#657">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#655-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($data) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="656">656</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="657">657</a>
</td>
<td class="c0" >
<a href="#658">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($token, $token_type) = $self->_extract_token_from_response($data); </td>
</tr>
<tr>
<td class="h" >
<a name="658">658</a>
</td>
<td class="c0" >
<a href="#659">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#658-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $token or die "No access token\n"; </td>
</tr>
<tr>
<td class="h" >
<a name="659">659</a>
</td>
<td class="c0" >
<a href="#660">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->access_token($token); </td>
</tr>
<tr>
<td class="h" >
<a name="660">660</a>
</td>
<td class="c0" >
<a href="#661">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#660-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->access_token_type($token_type || 'Bearer'); </td>
</tr>
<tr>
<td class="h" >
<a name="661">661</a>
</td>
<td class="c0" >
<a href="#664">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $data; </td>
</tr>
<tr>
<td class="h" >
<a name="662">662</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }, </td>
</tr>
<tr>
<td class="h" >
<a name="663">663</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub { </td>
</tr>
<tr>
<td class="h" >
<a name="664">664</a>
</td>
<td class="c0" >
<a href="#666">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#664-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($data) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="665">665</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="666">666</a>
</td>
<td class="c0" >
<a href="#668">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#666-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die join "\n", ERROR_ACCESS_TOKEN, $self->_error_from_json($data) || $response->decoded_content; </td>
</tr>
<tr>
<td class="h" >
<a name="667">667</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="668">668</a>
</td>
<td class="c0" >
<a href="#672">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a name="669">669</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="670">670</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="671">671</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _access_auth_string { </td>
</tr>
<tr>
<td class="h" >
<a name="672">672</a>
</td>
<td class="c0" >
<a href="#673">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#672-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="673">673</a>
</td>
<td class="c0" >
<a href="#677">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return MIME::Base64::encode( join(":", $self->client_id, $self->client_secret) ); </td>
</tr>
<tr>
<td class="h" >
<a name="674">674</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="675">675</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="676">676</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _extract_token_from_response { </td>
</tr>
<tr>
<td class="h" >
<a name="677">677</a>
</td>
<td class="c0" >
<a href="#678">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#677-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="678">678</a>
</td>
<td class="c0" >
<a href="#680">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $data = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="679">679</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="680">680</a>
</td>
<td class="c0" >
<a href="#684">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return ($data->{access_token}, $data->{token_type}); </td>
</tr>
<tr>
<td class="h" >
<a name="681">681</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="682">682</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="683">683</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _request_with_token { </td>
</tr>
<tr>
<td class="h" >
<a name="684">684</a>
</td>
<td class="c0" >
<a href="#685">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#684-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="685">685</a>
</td>
<td class="c0" >
<a href="#686">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#685-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $request = shift or croak "No request"; </td>
</tr>
<tr>
<td class="h" >
<a name="686">686</a>
</td>
<td class="c0" >
<a href="#688">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $force_fresh = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="687">687</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="688">688</a>
</td>
<td class="c0" >
<a href="#689">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#688-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $token = $force_fresh ? undef : $self->access_token; </td>
</tr>
<tr>
<td class="h" >
<a name="689">689</a>
</td>
<td class="c0" >
<a href="#690">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#689-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless ($token) { </td>
</tr>
<tr>
<td class="h" >
<a name="690">690</a>
</td>
<td class="c0" >
<a href="#691">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $request = $self->make_access_token_request; </td>
</tr>
<tr>
<td class="h" >
<a name="691">691</a>
</td>
<td class="c0" >
<a href="#692">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->_request_access_token($request); </td>
</tr>
<tr>
<td class="h" >
<a name="692">692</a>
</td>
<td class="c0" >
<a href="#694">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $token = $self->access_token; </td>
</tr>
<tr>
<td class="h" >
<a name="693">693</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="694">694</a>
</td>
<td class="c0" >
<a href="#695">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#694-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "No access token" unless $token; </td>
</tr>
<tr>
<td class="h" >
<a name="695">695</a>
</td>
<td class="c0" >
<a href="#697">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $token_type = $self->access_token_type; </td>
</tr>
<tr>
<td class="h" >
<a name="696">696</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="697">697</a>
</td>
<td class="c0" >
<a href="#698">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $request->header( Authorization => "$token_type $token" ); </td>
</tr>
<tr>
<td class="h" >
<a name="698">698</a>
</td>
<td class="c0" >
<a href="#705">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->user_agent->request( $request ); </td>
</tr>
<tr>
<td class="h" >
<a name="699">699</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="700">700</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="701">701</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Strictly speaking process_json_response() and process_json_error_response() </td>
</tr>
<tr>
<td class="h" >
<a name="702">702</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # should go to ::JSON. However, JSON is used for authentication services even for </td>
</tr>
<tr>
<td class="h" >
<a name="703">703</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # APIs that are XML, so need to be available </td>
</tr>
<tr>
<td class="h" >
<a name="704">704</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub process_json_response { </td>
</tr>
<tr>
<td class="h" >
<a name="705">705</a>
</td>
<td class="c0" >
<a href="#706">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#705-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#705-1">
0
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="706">706</a>
</td>
<td class="c0" >
<a href="#707">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#706-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = shift or croak "No response"; </td>
</tr>
<tr>
<td class="h" >
<a name="707">707</a>
</td>
<td class="c0" >
<a href="#708">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $success_callback = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="708">708</a>
</td>
<td class="c0" >
<a href="#710">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $error_callback = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="709">709</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="710">710</a>
</td>
<td class="c0" >
<a href="#711">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#710-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless ($response->is_success) { </td>
</tr>
<tr>
<td class="h" >
<a name="711">711</a>
</td>
<td class="c0" >
<a href="#714">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->process_json_error_response($response, $error_callback); </td>
</tr>
<tr>
<td class="h" >
<a name="712">712</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="713">713</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="714">714</a>
</td>
<td class="c0" >
<a href="#715">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $content_type = $response->header('Content-Type'); </td>
</tr>
<tr>
<td class="h" >
<a name="715">715</a>
</td>
<td class="c0" >
<a href="#717">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#715-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#715-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "Invalid Content-Type\n".$response->as_string </td>
</tr>
<tr>
<td class="h" >
<a name="716">716</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless $content_type && $content_type =~ m!application/json!; </td>
</tr>
<tr>
<td class="h" >
<a name="717">717</a>
</td>
<td class="c0" >
<a href="#720">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#717-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $content = $response->decoded_content </td>
</tr>
<tr>
<td class="h" >
<a name="718">718</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die $self->invalid_response_exception_string($response); </td>
</tr>
<tr>
<td class="h" >
<a name="719">719</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="720">720</a>
</td>
<td class="c0" >
<a href="#722">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> local $@; </td>
</tr>
<tr>
<td class="h" >
<a name="721">721</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="722">722</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#722-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $data = $content ? eval { from_json( $content ) } : {}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#723">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="723">723</a>
</td>
<td class="c0" >
<a href="#725">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#723-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "$@\nResponse:\n".$response->as_string if $@; </td>
</tr>
<tr>
<td class="h" >
<a name="724">724</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="725">725</a>
</td>
<td class="c0" >
<a href="#727">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#725-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $data unless $success_callback; </td>
</tr>
<tr>
<td class="h" >
<a name="726">726</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="727">727</a>
</td>
<td class="c0" >
<a href="#728">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $res = eval { </td>
</tr>
<tr>
<td class="h" >
<a name="728">728</a>
</td>
<td class="c0" >
<a href="#730">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $success_callback->($data); </td>
</tr>
<tr>
<td class="h" >
<a name="729">729</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }; </td>
</tr>
<tr>
<td class="h" >
<a name="730">730</a>
</td>
<td class="c0" >
<a href="#731">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#730-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "$@\nResponse:\n$content" if $@; </td>
</tr>
<tr>
<td class="h" >
<a name="731">731</a>
</td>
<td class="c0" >
<a href="#735">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $res; </td>
</tr>
<tr>
<td class="h" >
<a name="732">732</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="733">733</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="734">734</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub process_json_error_response { </td>
</tr>
<tr>
<td class="h" >
<a name="735">735</a>
</td>
<td class="c0" >
<a href="#736">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#735-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#735-1">
0
</a>
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="736">736</a>
</td>
<td class="c0" >
<a href="#737">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#736-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = shift or croak "No response"; </td>
</tr>
<tr>
<td class="h" >
<a name="737">737</a>
</td>
<td class="c0" >
<a href="#739">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $error_callback = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="738">738</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="739">739</a>
</td>
<td class="c0" >
<a href="#740">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $content_type = $response->header('Content-Type'); </td>
</tr>
<tr>
<td class="h" >
<a name="740">740</a>
</td>
<td class="c0" >
<a href="#741">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#740-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#740-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if ($content_type && $content_type =~ m!application/json!) { </td>
</tr>
<tr>
<td class="h" >
<a name="741">741</a>
</td>
<td class="c0" >
<a href="#744">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#741-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $content = $response->decoded_content </td>
</tr>
<tr>
<td class="h" >
<a name="742">742</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die $self->invalid_response_exception_string($response); </td>
</tr>
<tr>
<td class="h" >
<a name="743">743</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="744">744</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $data = eval { from_json( $content ) }; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#745">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="745">745</a>
</td>
<td class="c0" >
<a href="#747">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#745-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#745-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die $content || $self->invalid_response_exception_string($response) if $@; </td>
</tr>
<tr>
<td class="h" >
<a name="746">746</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="747">747</a>
</td>
<td class="c0" >
<a href="#748">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#747-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if ($error_callback) { </td>
</tr>
<tr>
<td class="h" >
<a name="748">748</a>
</td>
<td class="c0" >
<a href="#751">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $error_callback->($data); </td>
</tr>
<tr>
<td class="h" >
<a name="749">749</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="750">750</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="751">751</a>
</td>
<td class="c0" >
<a href="#753">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--condition.html#751-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die $self->_error_from_json($data) || "Invalid response:\n$content"; </td>
</tr>
<tr>
<td class="h" >
<a name="752">752</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="753">753</a>
</td>
<td class="c0" >
<a href="#760">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die $self->invalid_response_exception_string($response); </td>
</tr>
<tr>
<td class="h" >
<a name="754">754</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="755">755</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="756">756</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#756-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _error_from_json {}; </td>
</tr>
<tr>
<td class="h" >
<a name="757">757</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="758">758</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # wrapper around error response handlers to include some debugging if the debug flag is set </td>
</tr>
<tr>
<td class="h" >
<a name="759">759</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _error_result { </td>
</tr>
<tr>
<td class="h" >
<a name="760">760</a>
</td>
<td class="c0" >
<a href="#761">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#760-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="761">761</a>
</td>
<td class="c0" >
<a href="#762">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#761-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $process_sub = shift or croak "No process sub"; </td>
</tr>
<tr>
<td class="h" >
<a name="762">762</a>
</td>
<td class="c0" >
<a href="#763">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#762-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $request = shift or croak "No HTTP request"; </td>
</tr>
<tr>
<td class="h" >
<a name="763">763</a>
</td>
<td class="c0" >
<a href="#765">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#763-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $response = shift or croak "No HTTP response"; </td>
</tr>
<tr>
<td class="h" >
<a name="764">764</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="765">765</a>
</td>
<td class="c0" >
<a href="#767">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#765-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $process_sub->() unless $DEBUG; </td>
</tr>
<tr>
<td class="h" >
<a name="766">766</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="767">767</a>
</td>
<td class="c0" >
<a href="#768">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> local $@; </td>
</tr>
<tr>
<td class="h" >
<a name="768">768</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $ret = eval { $process_sub->() }; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#769">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="769">769</a>
</td>
<td class="c0" >
<a href="#771">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#769-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die join "\n", $@, "Request:", $request->as_string, "Response:", $response->as_string </td>
</tr>
<tr>
<td class="h" >
<a name="770">770</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $@; </td>
</tr>
<tr>
<td class="h" >
<a name="771">771</a>
</td>
<td class="c0" >
<a href="#775">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $ret; </td>
</tr>
<tr>
<td class="h" >
<a name="772">772</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="773">773</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="774">774</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _result_xlate { </td>
</tr>
<tr>
<td class="h" >
<a name="775">775</a>
</td>
<td class="c0" >
<a href="#776">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--subroutine.html#775-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="776">776</a>
</td>
<td class="c0" >
<a href="#777">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $res = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="777">777</a>
</td>
<td class="c0" >
<a href="#781">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $xlate_table = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="778">778</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="779">779</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return { </td>
</tr>
<tr>
<td class="h" >
<a name="780">780</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> map { </td>
</tr>
<tr>
<td class="h" >
<a name="781">781</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $val = $res->{$_}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#782">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="782">782</a>
</td>
<td class="c0" >
0
</td>
<td class="c0" >
<a href="blib-lib-WebService-ILS-pm--branch.html#782-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> defined($val) ? ($xlate_table->{$_} => $val) : () </td>
</tr>
<tr>
<td class="h" >
<a name="783">783</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } keys %$xlate_table </td>
</tr>
<tr>
<td class="h" >
<a name="784">784</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }; </td>
</tr>
<tr>
<td class="h" >
<a name="785">785</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="786">786</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="787">787</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="788">788</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 TODO </td>
</tr>
<tr>
<td class="h" >
<a name="789">789</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="790">790</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Federated search </td>
</tr>
<tr>
<td class="h" >
<a name="791">791</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="792">792</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="793">793</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="794">794</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 1; </td>
</tr>
<tr>
<td class="h" >
<a name="795">795</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="796">796</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> __END__ </td>
</tr>
</table>
</body>
</html>
|