File Coverage

blib/lib/ACME/2026.pm
Criterion Covered Total %
statement 196 306 64.0
branch 69 204 33.8
condition 14 66 21.2
subroutine 32 38 84.2
pod 13 13 100.0
total 324 627 51.6


line stmt bran cond sub pod time code
1             package ACME::2026;
2              
3 2     2   246162 use 5.008003;
  2         8  
4 2     2   16 use strict;
  2         4  
  2         86  
5 2     2   13 use warnings;
  2         3  
  2         148  
6              
7 2     2   12 use Carp qw(croak);
  2         5  
  2         141  
8 2     2   10 use Exporter 'import';
  2         22  
  2         72  
9 2     2   997 use File::Temp qw(tempfile);
  2         21580  
  2         163  
10 2     2   1839 use JSON::PP ();
  2         43683  
  2         78  
11 2     2   1463 use POSIX qw(strftime);
  2         15024  
  2         17  
12              
13             =head1 NAME
14              
15             ACME::2026 - Checklists for glorious 2026 goals
16              
17             =head1 VERSION
18              
19             Version 0.01
20              
21             =cut
22              
23             our $VERSION = '0.01';
24              
25             our @EXPORT_OK = qw(
26             plan_new plan_load plan_save
27             add_item update_item delete_item get_item
28             add_note complete_item skip_item reopen_item
29             items stats
30             );
31              
32             our %EXPORT_TAGS = ( all => \@EXPORT_OK );
33              
34             =head1 SYNOPSIS
35              
36             use ACME::2026 qw(:all);
37              
38             my $plan = plan_new(
39             title => '2026',
40             storage => '2026.json',
41             autosave => 1,
42             );
43              
44             my $id = add_item($plan, 'Run a marathon',
45             list => 'Health',
46             due => '2026-10-01',
47             tags => [qw/fitness endurance/],
48             priority => 2,
49             );
50              
51             complete_item($plan, $id, note => 'Signed up for NYC');
52             my @open = items($plan, status => 'todo', list => 'Health', sort => 'due');
53              
54             plan_save($plan);
55              
56             =head1 DESCRIPTION
57              
58             ACME::2026 is a tiny functional API for keeping 2026 checklists. It stores
59             plans as plain Perl hashrefs and can persist them to JSON.
60              
61             =head1 DATA MODEL
62              
63             Plan hashref:
64              
65             {
66             title => '2026',
67             items => [ ... ],
68             next_id => 1,
69             created_at => '2026-01-01T12:00:00Z',
70             updated_at => '2026-01-01T12:00:00Z',
71             storage => '2026.json',
72             autosave => 1,
73             }
74              
75             Item hashref:
76              
77             {
78             id => 1,
79             title => 'Run a marathon',
80             status => 'todo',
81             list => 'Health',
82             tags => ['fitness'],
83             priority => 2,
84             due => '2026-10-01',
85             notes => [ { note => 'Signed up', at => '2026-02-10T09:00:00Z' } ],
86             created_at => '2026-01-01T12:00:00Z',
87             updated_at => '2026-02-10T09:00:00Z',
88             }
89              
90             Status values are C, C, or C. Dates are ISO 8601 strings
91             (C or C).
92              
93             =head1 FUNCTIONS
94              
95             =head2 plan_new
96              
97             my $plan = plan_new(%opts);
98              
99             Creates a new plan hashref. Supported options:
100              
101             title - plan title (default: 2026)
102             storage - JSON path used by plan_save and autosave
103             autosave - boolean, save after mutating operations
104              
105             =head2 plan_load
106              
107             my $plan = plan_load($path, %opts);
108              
109             Loads a JSON file from C<$path>. The plan is normalized to ensure required
110             fields exist. You can override C or C<autosave> with C<%opts>. </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"> =head2 plan_save </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"> plan_save($plan); </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"> plan_save($plan, $path); </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"> Writes the plan as JSON. Uses C<$plan-E<gt>{storage}> if no path is provided. </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 add_item </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $id = add_item($plan, $title, %opts); </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Adds an item and returns its id. Supported options: </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> list, tags (arrayref or string), priority, due, note </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"> =head2 update_item </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 $item = update_item($plan, $id, %attrs); </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">   </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Updates a few fields in place: C<title>, C<list>, C<tags>, C<priority>, C<due>. </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Use C<add_note> or the status helpers for notes and status changes. </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 delete_item </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"> my $item = delete_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="137">137</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="138">138</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Removes an item and returns it. </td> </tr> <tr> <td class="h" > <a name="139">139</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> =head2 get_item </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $item = get_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="143">143</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> Returns the item or C<undef> if it does not exist. </td> </tr> <tr> <td class="h" > <a name="145">145</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="146">146</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 add_note </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"> add_note($plan, $id, $note); </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">   </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"> Appends a note with a timestamp. </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">   </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"> =head2 complete_item </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">   </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"> complete_item($plan, $id, %opts); </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">   </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"> Sets the status to C<done>. If C<note> is supplied, it is added. </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">   </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"> =head2 skip_item </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">   </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"> skip_item($plan, $id, %opts); </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">   </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"> Sets the status to C<skipped>. If C<note> is supplied, it is added. </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"> =head2 reopen_item </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"> reopen_item($plan, $id, %opts); </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"> Sets the status back to C<todo>. If C<note> is supplied, it is added. </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"> =head2 items </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">   </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"> my @items = items($plan, %filters); </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">   </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"> Filters items with any of: </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"> status, list, tag, tags, priority, min_priority, max_priority, </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"> due_before, due_after, sort </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">   </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"> For C<tag> or C<tags>, any matching tag is enough. C<sort> supports: </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"> C<due>, C<priority>, C<created>, C<updated>, or C<title>. Prefix with C<-> </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"> for descending order. </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">   </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"> =head2 stats </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">   </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"> my $stats = stats($plan, %filters); </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">   </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"> Returns a hashref with C<total>, C<todo>, C<done>, C<skipped>, and </td> </tr> <tr> <td class="h" > <a name="188">188</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<complete_pct>. </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">   </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"> =cut </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">   </td> </tr> <tr> <td class="h" > <a name="192">192</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub plan_new { </td> </tr> <tr> <td class="h" > <a name="193">193</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#193-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#193-1"> 1 </a> </td> <td > 210421 </td> <td class="s"> my %opts = _normalize_opts(@_); </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">   </td> </tr> <tr> <td class="h" > <a name="195">195</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> my $now = _now(); </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"> my $plan = { </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"> title => defined $opts{title} ? $opts{title} : '2026', </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"> items => [], </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"> next_id => 1, </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"> created_at => $now, </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"> updated_at => $now, </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"> storage => $opts{storage}, </td> </tr> <tr> <td class="h" > <a name="203">203</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#203-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 45 </td> <td class="s"> autosave => $opts{autosave} ? 1 : 0, </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#-2"> 50 </a> </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"> }; </td> </tr> <tr> <td class="h" > <a name="205">205</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="206">206</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> return $plan; </td> </tr> <tr> <td class="h" > <a name="207">207</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="208">208</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> sub plan_load { </td> </tr> <tr> <td class="h" > <a name="210">210</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#210-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#210-1"> 1 </a> </td> <td > 9 </td> <td class="s"> my ($path, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="211">211</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#211-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#211-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> croak 'plan_load requires a path' unless defined $path && length $path; </td> </tr> <tr> <td class="h" > <a name="212">212</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="213">213</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> my $json = _read_file($path); </td> </tr> <tr> <td class="h" > <a name="214">214</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> my $data = eval { JSON::PP->new->decode($json) }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 36 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="215">215</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#215-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10386 </td> <td class="s"> croak "Failed to decode JSON from $path: $@" if $@; </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> _normalize_plan($data); </td> </tr> <tr> <td class="h" > <a name="218">218</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="219">219</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> $data->{storage} = $path; </td> </tr> <tr> <td class="h" > <a name="220">220</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#220-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> $data->{title} = $opts{title} if exists $opts{title}; </td> </tr> <tr> <td class="h" > <a name="221">221</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#221-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> $data->{autosave} = $opts{autosave} ? 1 : 0 if exists $opts{autosave}; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#-2"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="222">222</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="223">223</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> return $data; </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"> sub plan_save { </td> </tr> <tr> <td class="h" > <a name="227">227</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#227-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#227-1"> 1 </a> </td> <td > 7789 </td> <td class="s"> my ($plan, $path) = @_; </td> </tr> <tr> <td class="h" > <a name="228">228</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> _ensure_plan($plan); </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 class="c3" > 1 </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#230-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> $path ||= $plan->{storage}; </td> </tr> <tr> <td class="h" > <a name="231">231</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#231-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#231-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> croak 'plan_save requires a path or plan storage' unless defined $path && length $path; </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> _normalize_plan($plan); </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 14 </td> <td class="s"> my $encoder = JSON::PP->new->canonical(1)->pretty(1); </td> </tr> <tr> <td class="h" > <a name="236">236</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 168 </td> <td class="s"> my $json = $encoder->encode($plan); </td> </tr> <tr> <td class="h" > <a name="237">237</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1697 </td> <td class="s"> _write_file_atomic($path, $json); </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 20 </td> <td class="s"> return 1; </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">   </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"> sub add_item { </td> </tr> <tr> <td class="h" > <a name="243">243</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#243-1"> 2 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#243-1"> 1 </a> </td> <td > 2144 </td> <td class="s"> my ($plan, @args) = @_; </td> </tr> <tr> <td class="h" > <a name="244">244</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> _ensure_plan($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="246">246</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> my ($title, %opts); </td> </tr> <tr> <td class="h" > <a name="247">247</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#247-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> if (@args % 2 == 1) { </td> </tr> <tr> <td class="h" > <a name="248">248</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> $title = shift @args; </td> </tr> <tr> <td class="h" > <a name="249">249</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> %opts = @args; </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"> } else { </td> </tr> <tr> <td class="h" > <a name="251">251</a> </td> <td class="c0" > <a href="#252"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> %opts = @args; </td> </tr> <tr> <td class="h" > <a name="252">252</a> </td> <td class="c0" > <a href="#274"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $title = $opts{title}; </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"> } </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 class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#255-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#255-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> croak 'add_item requires a title' unless defined $title && length $title; </td> </tr> <tr> <td class="h" > <a name="256">256</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> _reject_unknown('add_item', \%opts, qw(title list tags tag priority due note)); </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">   </td> </tr> <tr> <td class="h" > <a name="258">258</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> my $now = _now(); </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"> my $item = { </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"> id => $plan->{next_id}++, </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"> title => $title, </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"> status => 'todo', </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"> list => defined $opts{list} ? $opts{list} : 'General', </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"> tags => _normalize_tags($opts{tags}, $opts{tag}), </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"> priority => defined $opts{priority} ? $opts{priority} : 3, </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"> due => $opts{due}, </td> </tr> <tr> <td class="h" > <a name="267">267</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#267-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 19 </td> <td class="s"> notes => [], </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--branch.html#-2"> 100 </a> </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"> created_at => $now, </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"> updated_at => $now, </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"> }; </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 class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> push @{ $plan->{items} }, $item; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="273">273</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#273-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 30 </td> <td class="s"> if (defined $opts{note}) { </td> </tr> <tr> <td class="h" > <a name="274">274</a> </td> <td class="c0" > <a href="#284"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _add_note($plan, $item, $opts{note}); </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"> } else { </td> </tr> <tr> <td class="h" > <a name="276">276</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> _touch($plan); </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 class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> _maybe_autosave($plan); </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 class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> return $item->{id}; </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">   </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"> sub update_item { </td> </tr> <tr> <td class="h" > <a name="284">284</a> </td> <td class="c0" > <a href="#285"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#284-1"> 0 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#284-1"> 1 </a> </td> <td > 0 </td> <td class="s"> my ($plan, $id, %attrs) = @_; </td> </tr> <tr> <td class="h" > <a name="285">285</a> </td> <td class="c0" > <a href="#287"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _ensure_plan($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="287">287</a> </td> <td class="c0" > <a href="#288"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $item = _find_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="288">288</a> </td> <td class="c0" > <a href="#290"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#288-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> croak "No item with id $id" unless $item; </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 class="c0" > <a href="#292"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _reject_unknown('update_item', \%attrs, qw(title list tags tag priority due)); </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 class="c0" > <a href="#293"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $changed = 0; </td> </tr> <tr> <td class="h" > <a name="293">293</a> </td> <td class="c0" > <a href="#294"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> for my $key (qw(title list priority due)) { </td> </tr> <tr> <td class="h" > <a name="294">294</a> </td> <td class="c0" > <a href="#295"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#294-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> next unless exists $attrs{$key}; </td> </tr> <tr> <td class="h" > <a name="295">295</a> </td> <td class="c0" > <a href="#296"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $item->{$key} = $attrs{$key}; </td> </tr> <tr> <td class="h" > <a name="296">296</a> </td> <td class="c0" > <a href="#299"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $changed = 1; </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">   </td> </tr> <tr> <td class="h" > <a name="299">299</a> </td> <td class="c0" > <a href="#300"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#299-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#299-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if (exists $attrs{tags} || exists $attrs{tag}) { </td> </tr> <tr> <td class="h" > <a name="300">300</a> </td> <td class="c0" > <a href="#301"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $item->{tags} = _normalize_tags($attrs{tags}, $attrs{tag}); </td> </tr> <tr> <td class="h" > <a name="301">301</a> </td> <td class="c0" > <a href="#304"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $changed = 1; </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"> } </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 class="c0" > <a href="#306"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#304-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return $item unless $changed; </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 class="c0" > <a href="#307"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $item->{updated_at} = _now(); </td> </tr> <tr> <td class="h" > <a name="307">307</a> </td> <td class="c0" > <a href="#308"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _touch($plan); </td> </tr> <tr> <td class="h" > <a name="308">308</a> </td> <td class="c0" > <a href="#310"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _maybe_autosave($plan); </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 class="c0" > <a href="#314"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return $item; </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">   </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"> sub delete_item { </td> </tr> <tr> <td class="h" > <a name="314">314</a> </td> <td class="c0" > <a href="#315"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#314-1"> 0 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#314-1"> 1 </a> </td> <td > 0 </td> <td class="s"> my ($plan, $id) = @_; </td> </tr> <tr> <td class="h" > <a name="315">315</a> </td> <td class="c0" > <a href="#317"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _ensure_plan($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="317">317</a> </td> <td class="c0" > <a href="#318"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $items = $plan->{items}; </td> </tr> <tr> <td class="h" > <a name="318">318</a> </td> <td class="c0" > <a href="#319"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> for my $idx (0 .. $#$items) { </td> </tr> <tr> <td class="h" > <a name="319">319</a> </td> <td class="c0" > <a href="#320"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#319-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#319-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> next unless defined $items->[$idx]{id} && $items->[$idx]{id} == $id; </td> </tr> <tr> <td class="h" > <a name="320">320</a> </td> <td class="c0" > <a href="#321"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $item = splice(@$items, $idx, 1); </td> </tr> <tr> <td class="h" > <a name="321">321</a> </td> <td class="c0" > <a href="#322"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _touch($plan); </td> </tr> <tr> <td class="h" > <a name="322">322</a> </td> <td class="c0" > <a href="#323"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _maybe_autosave($plan); </td> </tr> <tr> <td class="h" > <a name="323">323</a> </td> <td class="c0" > <a href="#326"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return $item; </td> </tr> <tr> <td class="h" > <a name="324">324</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="325">325</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="326">326</a> </td> <td class="c0" > <a href="#336"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return; </td> </tr> <tr> <td class="h" > <a name="327">327</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub get_item { </td> </tr> <tr> <td class="h" > <a name="330">330</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#330-1"> 2 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#330-1"> 1 </a> </td> <td > 1859 </td> <td class="s"> my ($plan, $id) = @_; </td> </tr> <tr> <td class="h" > <a name="331">331</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> _ensure_plan($plan); </td> </tr> <tr> <td class="h" > <a name="332">332</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> return _find_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="333">333</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="334">334</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="335">335</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub add_note { </td> </tr> <tr> <td class="h" > <a name="336">336</a> </td> <td class="c0" > <a href="#337"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#336-1"> 0 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#336-1"> 1 </a> </td> <td > 0 </td> <td class="s"> my ($plan, $id, $note) = @_; </td> </tr> <tr> <td class="h" > <a name="337">337</a> </td> <td class="c0" > <a href="#338"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _ensure_plan($plan); </td> </tr> <tr> <td class="h" > <a name="338">338</a> </td> <td class="c0" > <a href="#340"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#338-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#338-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> croak 'add_note requires a note' unless defined $note && length $note; </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 class="c0" > <a href="#341"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $item = _find_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="341">341</a> </td> <td class="c0" > <a href="#343"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#341-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> croak "No item with id $id" unless $item; </td> </tr> <tr> <td class="h" > <a name="342">342</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="343">343</a> </td> <td class="c0" > <a href="#344"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _add_note($plan, $item, $note); </td> </tr> <tr> <td class="h" > <a name="344">344</a> </td> <td class="c0" > <a href="#346"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _maybe_autosave($plan); </td> </tr> <tr> <td class="h" > <a name="345">345</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="346">346</a> </td> <td class="c0" > <a href="#355"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return $item; </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">   </td> </tr> <tr> <td class="h" > <a name="349">349</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub complete_item { </td> </tr> <tr> <td class="h" > <a name="350">350</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#350-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#350-1"> 1 </a> </td> <td > 1841 </td> <td class="s"> my ($plan, $id, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="351">351</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> return _set_status($plan, $id, 'done', %opts); </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"> } </td> </tr> <tr> <td class="h" > <a name="353">353</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> sub skip_item { </td> </tr> <tr> <td class="h" > <a name="355">355</a> </td> <td class="c0" > <a href="#356"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#355-1"> 0 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#355-1"> 1 </a> </td> <td > 0 </td> <td class="s"> my ($plan, $id, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="356">356</a> </td> <td class="c0" > <a href="#360"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return _set_status($plan, $id, 'skipped', %opts); </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">   </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"> sub reopen_item { </td> </tr> <tr> <td class="h" > <a name="360">360</a> </td> <td class="c0" > <a href="#361"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#360-1"> 0 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#360-1"> 1 </a> </td> <td > 0 </td> <td class="s"> my ($plan, $id, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="361">361</a> </td> <td class="c0" > <a href="#376"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return _set_status($plan, $id, 'todo', %opts); </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"> } </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"> sub items { </td> </tr> <tr> <td class="h" > <a name="365">365</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#365-1"> 3 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#365-1"> 1 </a> </td> <td > 4215 </td> <td class="s"> my ($plan, %filters) = @_; </td> </tr> <tr> <td class="h" > <a name="366">366</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 11 </td> <td class="s"> _ensure_plan($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="368">368</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#368-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> my @items = @{ $plan->{items} || [] }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 17 </td> <td class="s">   </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 class="c3" > 3 </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--branch.html#370-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{status}) { </td> </tr> <tr> <td class="h" > <a name="371">371</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> my $status = _normalize_status($filters{status}); </td> </tr> <tr> <td class="h" > <a name="372">372</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> @items = grep { $_->{status} eq $status } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 14 </td> <td class="s">   </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"> } </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 class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#375-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{list}) { </td> </tr> <tr> <td class="h" > <a name="376">376</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#376-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{list} && $_->{list} eq $filters{list} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#382"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="379">379</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> my @tags; </td> </tr> <tr> <td class="h" > <a name="380">380</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#380-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 11 </td> <td class="s"> push @tags, $filters{tag} if defined $filters{tag}; </td> </tr> <tr> <td class="h" > <a name="381">381</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#381-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{tags}) { </td> </tr> <tr> <td class="h" > <a name="382">382</a> </td> <td class="c0" > <a href="#383"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#382-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if (ref $filters{tags} eq 'ARRAY') { </td> </tr> <tr> <td class="h" > <a name="383">383</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> push @tags, @{ $filters{tags} }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#385"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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"> } else { </td> </tr> <tr> <td class="h" > <a name="385">385</a> </td> <td class="c0" > <a href="#391"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> push @tags, $filters{tags}; </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="389">389</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#389-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> if (@tags) { </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"> @items = grep { </td> </tr> <tr> <td class="h" > <a name="391">391</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#391-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my %item_tags = map { $_ => 1 } @{ $_->{tags} || [] }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#392"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="392">392</a> </td> <td class="c0" > <a href="#393"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $match = 0; </td> </tr> <tr> <td class="h" > <a name="393">393</a> </td> <td class="c0" > <a href="#394"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> for my $tag (@tags) { </td> </tr> <tr> <td class="h" > <a name="394">394</a> </td> <td class="c0" > <a href="#395"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#394-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#394-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> next unless defined $tag && length $tag; </td> </tr> <tr> <td class="h" > <a name="395">395</a> </td> <td class="c0" > <a href="#396"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#395-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($item_tags{$tag}) { </td> </tr> <tr> <td class="h" > <a name="396">396</a> </td> <td class="c0" > <a href="#397"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $match = 1; </td> </tr> <tr> <td class="h" > <a name="397">397</a> </td> <td class="c0" > <a href="#400"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> last; </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"> } </td> </tr> <tr> <td class="h" > <a name="400">400</a> </td> <td class="c0" > <a href="#405"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $match; </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"> } @items; </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">   </td> </tr> <tr> <td class="h" > <a name="404">404</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#404-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{priority}) { </td> </tr> <tr> <td class="h" > <a name="405">405</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#405-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{priority} && $_->{priority} == $filters{priority} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#409"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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">   </td> </tr> <tr> <td class="h" > <a name="408">408</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#408-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> if (defined $filters{min_priority}) { </td> </tr> <tr> <td class="h" > <a name="409">409</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#409-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{priority} && $_->{priority} >= $filters{min_priority} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#413"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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">   </td> </tr> <tr> <td class="h" > <a name="412">412</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#412-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> if (defined $filters{max_priority}) { </td> </tr> <tr> <td class="h" > <a name="413">413</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#413-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{priority} && $_->{priority} <= $filters{max_priority} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#417"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="416">416</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#416-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{due_before}) { </td> </tr> <tr> <td class="h" > <a name="417">417</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#417-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{due} && $_->{due} le $filters{due_before} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#421"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="420">420</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#420-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> if (defined $filters{due_after}) { </td> </tr> <tr> <td class="h" > <a name="421">421</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#421-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = grep { defined $_->{due} && $_->{due} ge $filters{due_after} } @items; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#425"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="424">424</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#424-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> if (defined $filters{sort}) { </td> </tr> <tr> <td class="h" > <a name="425">425</a> </td> <td class="c0" > <a href="#467"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @items = _sort_items(\@items, $filters{sort}); </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="428">428</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 15 </td> <td class="s"> return @items; </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"> } </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"> sub stats { </td> </tr> <tr> <td class="h" > <a name="432">432</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#432-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#432-1"> 1 </a> </td> <td > 951 </td> <td class="s"> my ($plan, %filters) = @_; </td> </tr> <tr> <td class="h" > <a name="433">433</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> _ensure_plan($plan); </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> my @items = items($plan, %filters); </td> </tr> <tr> <td class="h" > <a name="436">436</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> my %stats = ( </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"> total => scalar @items, </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"> todo => 0, </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"> done => 0, </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"> skipped => 0, </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"> ); </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> for my $item (@items) { </td> </tr> <tr> <td class="h" > <a name="444">444</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#444-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> $stats{ $item->{status} }++ if exists $stats{ $item->{status} }; </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"> } </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"> $stats{complete_pct} = $stats{total} </td> </tr> <tr> <td class="h" > <a name="448">448</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#448-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> ? int(($stats{done} / $stats{total}) * 100 + 0.5) </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"> : 0; </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 class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> return \%stats; </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">   </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"> sub _set_status { </td> </tr> <tr> <td class="h" > <a name="455">455</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#455-1"> 1 </a> </td> <td >   </td> <td > 5 </td> <td class="s"> my ($plan, $id, $status, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="456">456</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> _ensure_plan($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="458">458</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> _reject_unknown('_set_status', \%opts, qw(note)); </td> </tr> <tr> <td class="h" > <a name="459">459</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 12 </td> <td class="s"> my $item = _find_item($plan, $id); </td> </tr> <tr> <td class="h" > <a name="460">460</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#460-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> croak "No item with id $id" unless $item; </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">   </td> </tr> <tr> <td class="h" > <a name="462">462</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> $item->{status} = _normalize_status($status); </td> </tr> <tr> <td class="h" > <a name="463">463</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> $item->{updated_at} = _now(); </td> </tr> <tr> <td class="h" > <a name="464">464</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#464-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> if (defined $opts{note}) { </td> </tr> <tr> <td class="h" > <a name="465">465</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> _add_note($plan, $item, $opts{note}); </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"> } else { </td> </tr> <tr> <td class="h" > <a name="467">467</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> _touch($plan); </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"> } </td> </tr> <tr> <td class="h" > <a name="469">469</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> _maybe_autosave($plan); </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">   </td> </tr> <tr> <td class="h" > <a name="471">471</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> return $item; </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">   </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"> sub _normalize_opts { </td> </tr> <tr> <td class="h" > <a name="475">475</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#475-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#475-1"> 33 </a> </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#475-1"> 1 </a> </td> <td >   </td> <td > 8 </td> <td class="s"> return %{ $_[0] } if @_ == 1 && ref $_[0] eq 'HASH'; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#499"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="476">476</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> return @_; </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"> } </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"> sub _normalize_plan { </td> </tr> <tr> <td class="h" > <a name="480">480</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#480-1"> 2 </a> </td> <td >   </td> <td > 8 </td> <td class="s"> my ($plan) = @_; </td> </tr> <tr> <td class="h" > <a name="481">481</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> _ensure_plan($plan); </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 class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#483-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#483-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 19 </td> <td class="s"> $plan->{title} = '2026' unless defined $plan->{title} && length $plan->{title}; </td> </tr> <tr> <td class="h" > <a name="484">484</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#484-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> $plan->{items} = [] unless ref $plan->{items} eq 'ARRAY'; </td> </tr> <tr> <td class="h" > <a name="485">485</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#485-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> $plan->{autosave} = $plan->{autosave} ? 1 : 0; </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">   </td> </tr> <tr> <td class="h" > <a name="487">487</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> my $max_id = 0; </td> </tr> <tr> <td class="h" > <a name="488">488</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> for my $item (@{ $plan->{items} }) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="489">489</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#489-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> next unless ref $item eq 'HASH'; </td> </tr> <tr> <td class="h" > <a name="490">490</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#490-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#490-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 24 </td> <td class="s"> $max_id = $item->{id} if defined $item->{id} && $item->{id} > $max_id; </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">   </td> </tr> <tr> <td class="h" > <a name="493">493</a> </td> <td class="c3" > 2 </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#493-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> $plan->{next_id} = $plan->{next_id} || ($max_id + 1); </td> </tr> <tr> <td class="h" > <a name="494">494</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> my $next_id = $plan->{next_id}; </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 class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> for my $item (@{ $plan->{items} }) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="497">497</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#497-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 89 </td> <td class="s"> next unless ref $item eq 'HASH'; </td> </tr> <tr> <td class="h" > <a name="498">498</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#498-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 15 </td> <td class="s"> if (!defined $item->{id}) { </td> </tr> <tr> <td class="h" > <a name="499">499</a> </td> <td class="c0" > <a href="#521"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $item->{id} = $next_id++; </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"> } </td> </tr> <tr> <td class="h" > <a name="501">501</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> $item->{status} = _normalize_status($item->{status}); </td> </tr> <tr> <td class="h" > <a name="502">502</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> $item->{tags} = _normalize_tags($item->{tags}); </td> </tr> <tr> <td class="h" > <a name="503">503</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> $item->{notes} = _normalize_notes($item->{notes}); </td> </tr> <tr> <td class="h" > <a name="504">504</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#504-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 14 </td> <td class="s"> $item->{priority} = defined $item->{priority} ? $item->{priority} : 3; </td> </tr> <tr> <td class="h" > <a name="505">505</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#505-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 11 </td> <td class="s"> $item->{list} = defined $item->{list} ? $item->{list} : 'General'; </td> </tr> <tr> <td class="h" > <a name="506">506</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#506-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> $item->{created_at} = _now() unless defined $item->{created_at}; </td> </tr> <tr> <td class="h" > <a name="507">507</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#507-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> $item->{updated_at} = $item->{created_at} unless defined $item->{updated_at}; </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">   </td> </tr> <tr> <td class="h" > <a name="510">510</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#510-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> $plan->{next_id} = $next_id if $next_id > $plan->{next_id}; </td> </tr> <tr> <td class="h" > <a name="511">511</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#511-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> $plan->{created_at} = _now() unless defined $plan->{created_at}; </td> </tr> <tr> <td class="h" > <a name="512">512</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#512-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> $plan->{updated_at} = $plan->{created_at} unless defined $plan->{updated_at}; </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 class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 28 </td> <td class="s"> return $plan; </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">   </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"> sub _normalize_status { </td> </tr> <tr> <td class="h" > <a name="518">518</a> </td> <td class="c3" > 7 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#518-1"> 7 </a> </td> <td >   </td> <td > 17 </td> <td class="s"> my ($status) = @_; </td> </tr> <tr> <td class="h" > <a name="519">519</a> </td> <td class="c3" > 7 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#519-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#519-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 35 </td> <td class="s"> $status = 'todo' if !defined $status || $status eq ''; </td> </tr> <tr> <td class="h" > <a name="520">520</a> </td> <td class="c3" > 7 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#520-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#520-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 37 </td> <td class="s"> return $status if $status eq 'todo' || $status eq 'done' || $status eq 'skipped'; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#-2"> 33 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="521">521</a> </td> <td class="c0" > <a href="#532"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> croak "Unknown status '$status'"; </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"> } </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"> sub _normalize_tags { </td> </tr> <tr> <td class="h" > <a name="525">525</a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#525-1"> 6 </a> </td> <td >   </td> <td > 15 </td> <td class="s"> my ($tags, $tag) = @_; </td> </tr> <tr> <td class="h" > <a name="526">526</a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 12 </td> <td class="s"> my @tags; </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">   </td> </tr> <tr> <td class="h" > <a name="528">528</a> </td> <td class="c3" > 6 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#528-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> if (defined $tags) { </td> </tr> <tr> <td class="h" > <a name="529">529</a> </td> <td class="c3" > 6 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#529-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> if (ref $tags eq 'ARRAY') { </td> </tr> <tr> <td class="h" > <a name="530">530</a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 18 </td> <td class="s"> @tags = @$tags; </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"> } else { </td> </tr> <tr> <td class="h" > <a name="532">532</a> </td> <td class="c0" > <a href="#551"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> @tags = ($tags); </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"> } </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"> } </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">   </td> </tr> <tr> <td class="h" > <a name="536">536</a> </td> <td class="c3" > 6 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#536-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> push @tags, $tag if defined $tag; </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">   </td> </tr> <tr> <td class="h" > <a name="538">538</a> </td> <td class="c3" > 6 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#538-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> @tags = grep { defined $_ && length $_ } @tags; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 49 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="539">539</a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 36 </td> <td class="s"> return \@tags; </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">   </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"> sub _normalize_notes { </td> </tr> <tr> <td class="h" > <a name="543">543</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#543-1"> 4 </a> </td> <td >   </td> <td > 10 </td> <td class="s"> my ($notes) = @_; </td> </tr> <tr> <td class="h" > <a name="544">544</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#544-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> return [] unless defined $notes; </td> </tr> <tr> <td class="h" > <a name="545">545</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#545-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 11 </td> <td class="s"> if (ref $notes eq 'ARRAY') { </td> </tr> <tr> <td class="h" > <a name="546">546</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> my @out; </td> </tr> <tr> <td class="h" > <a name="547">547</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> for my $note (@$notes) { </td> </tr> <tr> <td class="h" > <a name="548">548</a> </td> <td class="c3" > 2 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#548-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> if (ref $note eq 'HASH') { </td> </tr> <tr> <td class="h" > <a name="549">549</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> push @out, $note; </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"> } else { </td> </tr> <tr> <td class="h" > <a name="551">551</a> </td> <td class="c0" > <a href="#556"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> push @out, { note => $note }; </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"> } </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 class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> return \@out; </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 class="c0" > <a href="#571"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return [ { note => $notes } ]; </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">   </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"> sub _ensure_plan { </td> </tr> <tr> <td class="h" > <a name="560">560</a> </td> <td class="c3" > 12 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#560-1"> 12 </a> </td> <td >   </td> <td > 24 </td> <td class="s"> my ($plan) = @_; </td> </tr> <tr> <td class="h" > <a name="561">561</a> </td> <td class="c3" > 12 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#561-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 46 </td> <td class="s"> croak 'Plan must be a hashref' unless ref $plan eq 'HASH'; </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">   </td> </tr> <tr> <td class="h" > <a name="564">564</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _find_item { </td> </tr> <tr> <td class="h" > <a name="565">565</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#565-1"> 3 </a> </td> <td >   </td> <td > 7 </td> <td class="s"> my ($plan, $id) = @_; </td> </tr> <tr> <td class="h" > <a name="566">566</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#566-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> return unless defined $id; </td> </tr> <tr> <td class="h" > <a name="567">567</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#567-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> for my $item (@{ $plan->{items} || [] }) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 12 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="568">568</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#568-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> next unless defined $item->{id}; </td> </tr> <tr> <td class="h" > <a name="569">569</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#569-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> return $item if $item->{id} == $id; </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"> } </td> </tr> <tr> <td class="h" > <a name="571">571</a> </td> <td class="c0" > <a href="#591"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return; </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 _add_note { </td> </tr> <tr> <td class="h" > <a name="575">575</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#575-1"> 1 </a> </td> <td >   </td> <td > 3 </td> <td class="s"> my ($plan, $item, $note) = @_; </td> </tr> <tr> <td class="h" > <a name="576">576</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#576-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#576-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> return unless defined $note && length $note; </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="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2 </td> <td class="s"> push @{ $item->{notes} }, { note => $note, at => _now() }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="579">579</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> $item->{updated_at} = _now(); </td> </tr> <tr> <td class="h" > <a name="580">580</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> _touch($plan); </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"> } </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"> sub _touch { </td> </tr> <tr> <td class="h" > <a name="584">584</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#584-1"> 3 </a> </td> <td >   </td> <td > 5 </td> <td class="s"> my ($plan) = @_; </td> </tr> <tr> <td class="h" > <a name="585">585</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> $plan->{updated_at} = _now(); </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">   </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"> sub _maybe_autosave { </td> </tr> <tr> <td class="h" > <a name="589">589</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#589-1"> 3 </a> </td> <td >   </td> <td > 5 </td> <td class="s"> my ($plan) = @_; </td> </tr> <tr> <td class="h" > <a name="590">590</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#590-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> return unless $plan->{autosave}; </td> </tr> <tr> <td class="h" > <a name="591">591</a> </td> <td class="c0" > <a href="#595"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> plan_save($plan); </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"> sub _sort_items { </td> </tr> <tr> <td class="h" > <a name="595">595</a> </td> <td class="c0" > <a href="#596"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--subroutine.html#595-1"> 0 </a> </td> <td >   </td> <td > 0 </td> <td class="s"> my ($items, $sort) = @_; </td> </tr> <tr> <td class="h" > <a name="596">596</a> </td> <td class="c0" > <a href="#598"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#596-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#596-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return @$items unless defined $sort && length $sort; </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 class="c0" > <a href="#600"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $desc = ($sort =~ s/^-//); </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 class="c0" > <a href="#602"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#600-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($sort eq 'due') { </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"> return sort { </td> </tr> <tr> <td class="h" > <a name="602">602</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#602-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $ad = defined $a->{due} ? $a->{due} : ($desc ? '0000-00-00' : '9999-12-31'); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#603"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#-2"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="603">603</a> </td> <td class="c0" > <a href="#604"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#603-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $bd = defined $b->{due} ? $b->{due} : ($desc ? '0000-00-00' : '9999-12-31'); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#-2"> 0 </a> </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 class="c0" > <a href="#605"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $cmp = $ad cmp $bd; </td> </tr> <tr> <td class="h" > <a name="605">605</a> </td> <td class="c0" > <a href="#609"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#605-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $desc ? -$cmp : $cmp; </td> </tr> <tr> <td class="h" > <a name="606">606</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } @$items; </td> </tr> <tr> <td class="h" > <a name="607">607</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="608">608</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="609">609</a> </td> <td class="c0" > <a href="#611"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#609-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($sort eq 'priority') { </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"> return sort { </td> </tr> <tr> <td class="h" > <a name="611">611</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#611-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $ad = defined $a->{priority} ? $a->{priority} : 0; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#612"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="612">612</a> </td> <td class="c0" > <a href="#613"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#612-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $bd = defined $b->{priority} ? $b->{priority} : 0; </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 >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $cmp = $ad <=> $bd; </td> </tr> <tr> <td class="h" > <a name="614">614</a> </td> <td class="c0" > <a href="#618"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#614-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $desc ? -$cmp : $cmp; </td> </tr> <tr> <td class="h" > <a name="615">615</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } @$items; </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 class="c0" > <a href="#620"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#618-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($sort eq 'created') { </td> </tr> <tr> <td class="h" > <a name="619">619</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return sort { </td> </tr> <tr> <td class="h" > <a name="620">620</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#620-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $cmp = ($a->{created_at} || '') cmp ($b->{created_at} || ''); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#621"> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#-2"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="621">621</a> </td> <td class="c0" > <a href="#625"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#621-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $desc ? -$cmp : $cmp; </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"> } @$items; </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">   </td> </tr> <tr> <td class="h" > <a name="625">625</a> </td> <td class="c0" > <a href="#627"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#625-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($sort eq 'updated') { </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"> return sort { </td> </tr> <tr> <td class="h" > <a name="627">627</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#627-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $cmp = ($a->{updated_at} || '') cmp ($b->{updated_at} || ''); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#628"> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#-2"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="628">628</a> </td> <td class="c0" > <a href="#632"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#628-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $desc ? -$cmp : $cmp; </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"> } @$items; </td> </tr> <tr> <td class="h" > <a name="630">630</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="631">631</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="632">632</a> </td> <td class="c0" > <a href="#634"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#632-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> if ($sort eq 'title') { </td> </tr> <tr> <td class="h" > <a name="633">633</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return sort { </td> </tr> <tr> <td class="h" > <a name="634">634</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#634-1"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> my $cmp = lc($a->{title} || '') cmp lc($b->{title} || ''); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#635"> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#-2"> 0 </a> </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="635">635</a> </td> <td class="c0" > <a href="#639"> 0 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#635-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> $desc ? -$cmp : $cmp; </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"> } @$items; </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">   </td> </tr> <tr> <td class="h" > <a name="639">639</a> </td> <td class="c0" > <a href="#647"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> return @$items; </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 _reject_unknown { </td> </tr> <tr> <td class="h" > <a name="643">643</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#643-1"> 3 </a> </td> <td >   </td> <td > 12 </td> <td class="s"> my ($context, $attrs, @known) = @_; </td> </tr> <tr> <td class="h" > <a name="644">644</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> my %known = map { $_ => 1 } @known; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 15 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 33 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="645">645</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 11 </td> <td class="s"> my @unknown = grep { !$known{$_} } keys %$attrs; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 7 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="646">646</a> </td> <td class="c3" > 3 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#646-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s"> return unless @unknown; </td> </tr> <tr> <td class="h" > <a name="647">647</a> </td> <td class="c0" > <a href="#676"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> croak "$context does not accept: " . join(', ', sort @unknown); </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _now { </td> </tr> <tr> <td class="h" > <a name="651">651</a> </td> <td class="c3" > 9 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#651-1"> 9 </a> </td> <td >   </td> <td > 261 </td> <td class="s"> return strftime('%Y-%m-%dT%H:%M:%SZ', gmtime()); </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"> } </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">   </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 _read_file { </td> </tr> <tr> <td class="h" > <a name="655">655</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#655-1"> 1 </a> </td> <td >   </td> <td > 2 </td> <td class="s"> my ($path) = @_; </td> </tr> <tr> <td class="h" > <a name="656">656</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#656-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 51 </td> <td class="s"> open my $fh, '<', $path or croak "Unable to read $path: $!"; </td> </tr> <tr> <td class="h" > <a name="657">657</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> local $/; </td> </tr> <tr> <td class="h" > <a name="658">658</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 51 </td> <td class="s"> return <$fh>; </td> </tr> <tr> <td class="h" > <a name="659">659</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="660">660</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="661">661</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _write_file_atomic { </td> </tr> <tr> <td class="h" > <a name="662">662</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#662-1"> 1 </a> </td> <td >   </td> <td > 4 </td> <td class="s"> my ($path, $content) = @_; </td> </tr> <tr> <td class="h" > <a name="663">663</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4 </td> <td class="s"> my ($fh, $tmp) = tempfile('acme2026-XXXXXX', DIR => _temp_dir($path)); </td> </tr> <tr> <td class="h" > <a name="664">664</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#664-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 600 </td> <td class="s"> print {$fh} $content or croak "Unable to write $tmp: $!"; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="665">665</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#665-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 56 </td> <td class="s"> close $fh or croak "Unable to close $tmp: $!"; </td> </tr> <tr> <td class="h" > <a name="666">666</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#666-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 275 </td> <td class="s"> rename $tmp, $path or croak "Unable to move $tmp to $path: $!"; </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 >   </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"> sub _temp_dir { </td> </tr> <tr> <td class="h" > <a name="670">670</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-ACME-2026-pm--subroutine.html#670-1"> 1 </a> </td> <td >   </td> <td > 3 </td> <td class="s"> my ($path) = @_; </td> </tr> <tr> <td class="h" > <a name="671">671</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#671-1"> 50 </a> </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--condition.html#671-1"> 33 </a> </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> return '.' unless defined $path && length $path; </td> </tr> <tr> <td class="h" > <a name="672">672</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#672-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> if ($path =~ /[\/\\]/) { </td> </tr> <tr> <td class="h" > <a name="673">673</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> $path =~ s/[\/\\][^\/\\]+$//; </td> </tr> <tr> <td class="h" > <a name="674">674</a> </td> <td class="c3" > 1 </td> <td class="c0" > <a href="blib-lib-ACME-2026-pm--branch.html#674-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 26 </td> <td class="s"> return length $path ? $path : '.'; </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 class="c0" > 0 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return '.'; </td> </tr> <tr> <td class="h" > <a name="677">677</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="678">678</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> =head1 AUTHOR </td> </tr> <tr> <td class="h" > <a name="680">680</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> Will Willis <wwillis@cpan.org> </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"> =head1 BUGS </td> </tr> <tr> <td class="h" > <a name="684">684</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="685">685</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Please report any bugs or feature requests to C<bug-acme-2026 at rt.cpan.org>, or through </td> </tr> <tr> <td class="h" > <a name="686">686</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the web interface at L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=ACME-2026>. I will be notified, and then you'll </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"> automatically be notified of progress on your bug as I make changes. </td> </tr> <tr> <td class="h" > <a name="688">688</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="689">689</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 SUPPORT </td> </tr> <tr> <td class="h" > <a name="690">690</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="691">691</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can find documentation for this module with the perldoc command. </td> </tr> <tr> <td class="h" > <a name="692">692</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> perldoc ACME::2026 </td> </tr> <tr> <td class="h" > <a name="694">694</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="695">695</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can also look for information at: </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 >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="698">698</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> =item * RT: CPAN's request tracker (report bugs here) </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"> L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=ACME-2026> </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">   </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"> =item * Search CPAN </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">   </td> </tr> <tr> <td class="h" > <a name="705">705</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://metacpan.org/release/ACME-2026> </td> </tr> <tr> <td class="h" > <a name="706">706</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="707">707</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="708">708</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> =head1 ACKNOWLEDGEMENTS </td> </tr> <tr> <td class="h" > <a name="710">710</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="711">711</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 LICENSE AND COPYRIGHT </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"> This software is Copyright (c) 2026 by Will Willis <wwillis@cpan.org>. </td> </tr> <tr> <td class="h" > <a name="714">714</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="715">715</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is free software, licensed under: </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">   </td> </tr> <tr> <td class="h" > <a name="717">717</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The Artistic License 2.0 (GPL Compatible) </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">   </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"> =cut </td> </tr> <tr> <td class="h" > <a name="720">720</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </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"> 1; # End of ACME::2026 </td> </tr> </table> </body> </html>