<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -12,31 +12,32 @@ END {
 	&lt;STDIN&gt;;
 }
 
+my $bot = App::SweeperBot-&gt;new;
 
 # Start Minesweeper.
 
-App::SweeperBot-&gt;spawn_minesweeper();
+$bot-&gt;spawn_minesweeper;
 
-sleep(2);
+sleep(2);	# Wait for game to start
 
-App::SweeperBot-&gt;locate_minesweeper();
-App::SweeperBot-&gt;enable_cheats() if App::SweeperBot::CHEAT;
+$bot-&gt;locate_minesweeper;
+$bot-&gt;enable_cheats if App::SweeperBot::CHEAT;
 
 while (1) {
 
 	print &quot;Starting a new game\n&quot;;
-	App::SweeperBot-&gt;new_game();
+	$bot-&gt;new_game();
 
 	while(1) {
 
-	    if (my $state = App::SweeperBot-&gt;game_over) {
+	    if (my $state = $bot-&gt;game_over) {
 		print &quot;Game over!  &quot;, $state &gt; 0 ? &quot;We won!\n&quot; : &quot;We lost!\n&quot;;
 		last;
 	    }
 
-	    my $game_state = App::SweeperBot-&gt;capture_game_state();
+	    my $game_state = $bot-&gt;capture_game_state();
 
-	    App::SweeperBot-&gt;make_move($game_state);
+	    $bot-&gt;make_move($game_state);
 	}
 
 	print &quot;Waiting 5 seconds before next game\n&quot;;</diff>
      <filename>bin/sweeperbot.pl</filename>
    </modified>
    <modified>
      <diff>@@ -7,8 +7,9 @@ package App::SweeperBot;
 #   ppm&gt; install Win32-GuiTest
 #   ppm&gt; install http://theoryx5.uwinnipeg.ca/ppms/Win32-Screenshot.ppd
 #
-# Windows versions of ImageMagick (which also install PerlMagick) can be located
-# at http://imagemagick.org/script/binary-releases.php
+# The version of Image-Magick used by this code can be found at
+# http://www.bribes.org/perl/ppmdir.html .  Different ImageMagick
+# distributions may result in different signature codes.
 #
 # 20050726, Matt Sparks (f0rked), http://f0rked.com
 
@@ -28,11 +29,14 @@ purposes only.  It is still under active development.
 Using this code for playing minesweeper on a production basis is
 strongly discouraged.
 
+=head1 METHODS
+
 =cut
 
 use strict;
 use warnings;
 use Carp;
+use NEXT;
 
 use 5.006;
 
@@ -87,6 +91,9 @@ use constant SQUARE1X =&gt; 15;
 use constant MIN_SQUARE1Y =&gt; 96;
 use constant MAX_SQAURE1Y =&gt; 115;
 
+# How far left of the smiley to click to focus on the board.
+use constant FOCUS_X_OFFSET =&gt; 50;
+
 my $Square1Y;
 
 my %char_for = (
@@ -116,8 +123,11 @@ my %smiley_type = (
     '0955e50dda3f850913392d4e654f9ef45df046f063a4b8faeff530609b37379f' =&gt;  0,
 );
 
-# old - Perl 5.8 and older ImageMagick
-# new - Perl 5.10 and new ImageMagick
+# old - Bribes distro ImageMagick
+# new - &quot;Official&quot; ImageMagick
+# NB: This code is primarily tested under the bribes distribution of
+# ImageMagick, because it plays nicely with PAR.  YMMV with other
+# versions.
 
 my %contents_of_square = (
         &quot;0b6f3e019208789db304a8a8c8bd509dacf62050a962ae9a0385733d6b595427&quot; =&gt; 0,           # old
@@ -145,6 +155,30 @@ my %contents_of_square = (
 	&quot;645d48aa778b2ac881a3921f3044a8ed96b8029915d9b300abbe91bef3427784&quot; =&gt; &quot;flag&quot;,      # new
 );
 
+=head2 new
+
+	my $sweperbot = App::SweeperBot-&gt;new;
+
+Creates a new C&lt;App::SweeperBot&gt; object.  Does not use any
+arguments passed, but will send them verbatim to an C&lt;_init&gt;
+method if defined on a child class.
+
+=cut
+
+sub new {
+	my ($class, @args) = @_;
+
+	my $this = {};
+
+	bless($this, $class);
+
+	$this-&gt;EVERY::LAST::_init(@args);
+
+	return $this;
+}
+
+
+
 =head2 spawn_minesweeper
 
 	$sweeperbot-&gt;spawn_minesweeper;
@@ -187,6 +221,8 @@ failure.
 =cut
 
 sub locate_minesweeper {
+	my ($this) = @_;
+
 	our $id=(FindWindowLike(0, &quot;^Minesweeper&quot;))[0];
         our($l,$t,$r,$b)=GetWindowRect($id);
         our($w,$h)=($r-$l,$b-$t);
@@ -214,19 +250,34 @@ sub locate_minesweeper {
         print &quot;$squares_x across, $squares_y down, $squares total\n&quot; if VERBOSE;
 
         print &quot;Focusing on the window\n&quot; if VERBOSE;
-        focus();
+        $this-&gt;focus();
 
 	return $id;
 }
 
+=head2 click
+
+	$sweeperbot-&gt;click($x,$y,$button);
+
+Clicks on ($x,$y) as an I&lt;absolute&gt; position on the screen.
+C&lt;$button&gt; is any button as understood by L&lt;Win32::GuiTest&gt;,
+usually C&lt;{LEFTCLICK}&gt;, C&lt;{MIDDLECLICK}&gt; or C&lt;{RIGHTCLICK}&gt;.
+
+If not specified, C&lt;$button&gt; defaults to a left-click.
+
+Returns nothing.
+
+=cut
+
 # Click the left button of the mouse.
 # Arguments: x, y as ABSOLUTE positions on the screen
 sub click {
-    my($x,$y,$button)=@_;
+    my($this, $x,$y,$button)=@_;
     $button ||= &quot;{LEFTCLICK}&quot;;
     MouseMoveAbsPix($x,$y);
     print &quot;Button: $button ($x,$y)\n&quot; if DEBUG;
     SendMouse($button);
+    return;
 }
 
 =head2 new_game
@@ -248,38 +299,93 @@ has been successfully started.
 # click on it.
 
 sub new_game {
+    my ($this) = @_;
     our ($reset_x,$reset_y);
-    click($reset_x,$reset_y);
+    $this-&gt;click($reset_x,$reset_y);
     return;
 }
 
+=head2 focus
+
+	$sweeperbot-&gt;focus;
+
+Focuses on t he  minesweeper window by clicking a little left of the
+smiley.  Does not check for success.  Returns nothing.
+
+=cut
+
 # Focus on the Minesweeper window by clicking a little to the left of the game
 # button.
 sub focus {
+    my ($this) = @_;
     our ($reset_x, $reset_y);
-    click($reset_x-50,$reset_y);
+    $this-&gt;click($reset_x - FOCUS_X_OFFSET ,$reset_y);
+    return;
 }
 
-# Get an image capture of a single field.
-# Arguments: sx, sy where 1,1 is the top left field in the grid.
-# Returns Image::Magick object
+=head2 capture_square
+
+	my $image = $sweeperbot-&gt;capture_square($x,$y);
+
+Captures the square ($x,$y) of the minesweeper board.  (1,1) is
+the top-left of the grid.  No checking is done to see if the square
+is actually on the board.  Returns the image as an L&lt;Image::Magick&gt;
+object.
+
+=head3 Bugs in capture_square
+
+On failure to capture the image, this returns an empty
+L&lt;Image::Magick&gt; object.  This is considered a bug; in the future
+C&lt;capture_square&gt; will throw an exception on error.
+
+C&lt;capture_square&gt; depends upon calibration routines that are
+currently implemented in the L&lt;/value&gt; method; calling it before
+the first call to L&lt;/value&gt; can result in incorrect or inconsistent
+results.  In future releases C&lt;capture_square&gt; will automatically
+calibrate itself if required.
+
+=cut
+
+# TODO GuiTest doesn't check the Image::Magick return codes, it
+# just assumes everything works.  We should consider writing our
+# own code that _does_ test, since these diagnostics are very
+# useful when things go wrong.
+
 sub capture_square {
-    my($sx,$sy)=@_;
+    my($this, $sx,$sy)=@_;
     our($l,$t);
     my $image=CaptureRect(
         $l+SQUARE1X+($sx-1)*SQUARE_W,
         $t+$Square1Y+($sy-1)*SQUARE_H,
         SQUARE_W,
-        SQUARE_H);
+        SQUARE_H
+    );
     return $image;
 }
 
-# Determine the value of a single field
-# Arguments: sx, sy
-# Returns string value
-sub value {
-    my($sx,$sy)=@_;
+=head2 value
+
+	my $value = $sweeperbot-&gt;value($x,$y);
+
+Returns the value in position ($x,$y) of the board, square
+(1,1) is considered the top-left of the grid.  Possible values
+are given below:
+
+	0-8		# Number of adjacent mines (0 = empty)
+	bomb		# A bomb (only when game lost)
+	bomb_hilight	# The bomb we hit (only when game lost)
+	flag		# A flag
+	unpressed	# An unpressed square
+
+Support of question-marks is not provided, but may be included
+in a future version.
 
+Throws an exception on failure.
+
+=cut
+
+sub value {
+    my($this, $sx,$sy)=@_;
 
     if (not $Square1Y) {
 	# We haven't calibrated our board yet.  Let's see if we can
@@ -291,7 +397,7 @@ sub value {
 
 	        warn &quot;Trying to calibrate board $i pixels down\n&quot; if DEBUG;
 
-	        my $sig = capture_square(1,1)-&gt;Get(&quot;signature&quot;);
+	        my $sig = $this-&gt;capture_square(1,1)-&gt;Get(&quot;signature&quot;);
 
 	        # Known signature, break out of calibration loop.
 	        last CALIBRATION if ($contents_of_square{$sig});
@@ -302,7 +408,7 @@ sub value {
         }
     }
 
-    my $sig=capture_square($sx,$sy)-&gt;Get(&quot;signature&quot;);
+    my $sig = $this-&gt; capture_square($sx,$sy)-&gt;Get(&quot;signature&quot;);
 
     my $result = $contents_of_square{$sig};
 
@@ -311,61 +417,113 @@ sub value {
     return $result;
 }
 
-# Find the signature of a square. This probably shouldn't be used since all (?)
-# of the signatures have already been determined.
-sub sig {
-    my($sx,$sy)=@_;
-    my $im=capture_square($sx,$sy);
-    return $im-&gt;Get(&quot;signature&quot;);
-}
+=head2 press
+
+	$sweeperbot-&gt;press($x,$y, $button)
+
+Clicks on the square with co-ordinates ($x,$y) using the mouse-button
+C&lt;$button&gt;, or left-click by default.  Square (1,1)
+is the top-left square.  Does not return a value.
+
+=cut
 
-# Click on a field.
-# Arguments: sx, sy
 sub press {
-    my($sx,$sy,$button)=@_;
+    my($this, $sx,$sy,$button)=@_;
     $button ||= &quot;{LEFTCLICK}&quot;;
     our($l,$t);
-    click(
+    $this-&gt;click(
         $l+SQUARE1X+($sx-1)*SQUARE_W+SQUARE_W/2,
         $t+$Square1Y+($sy-1)*SQUARE_H+SQUARE_W/2,
 	$button
     );
+
+    return;
 }
 
+=head2 stomp
+
+	$sweeperbot-&gt;stomp($x,$y);
+
+Stomps (middle-clicks) on the square at ($x,$y), normally used to
+stand on all squares adjacent to the square specified.  Square (1,1)
+is the top-left of the grid.  Does not return a value.
+
+=cut
+
 # Stomp on a square (left+right click)
 sub stomp {
-	press(@_,&quot;{MIDDLECLICK}&quot;);
+	my ($this, $x, $y) = @_;
+	$this-&gt;press($x,$y,&quot;{MIDDLECLICK}&quot;);
+
+	return;
 }
 
+=head2 flag_mines
+
+	$sweeperbot-&gt;flag_mines($game_state,
+		[2,3], [7,1], [8,3]
+	);
+
+Takes a game state, and a list of location tuples (array-refs),
+and marks all of those locations with flags.
+
+The requirement to pass C&lt;$game_state&gt; may be removed in a
+future version.
+
+=cut
+
 sub flag_mines {
-	my $game_state = shift;
-	foreach my $square (@_) {
+	my ($this, $game_state, @flag_these) = @_;
+
+	foreach my $square (@flag_these) {
 		my ($x,$y) = @$square;
 
 		# Skip to the next square if we have record that this
 		# has already been flagged (earlier this iteration).
 		next if $game_state-&gt;[$x][$y] eq &quot;flag&quot;;
 
-		press($x,$y,&quot;{RIGHTCLICK}&quot;);
+		$this-&gt;press($x,$y,&quot;{RIGHTCLICK}&quot;);
 		$game_state-&gt;[$x][$y] = &quot;flag&quot;;
 	}
+
+	return;
 }
 
+=begin deprecated
+
+# This code is left here as a mathom, but isn't used anymore.
+# Generally we want to call flag_mines() to flag mines, or
+# stomp() to stomp on a square.
+
 sub mark_adjacent {
-	my ($x, $y) = @_;
-	press($x-1,$y-1,&quot;{RIGHTCLICK}&quot;);
-	press($x  ,$y-1,&quot;{RIGHTCLICK}&quot;);
-	press($x+1,$y-1,&quot;{RIGHTCLICK}&quot;);
+	my ($this, $x, $y) = @_;
+	$this-&gt;press($x-1,$y-1,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x  ,$y-1,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x+1,$y-1,&quot;{RIGHTCLICK}&quot;);
 
-	press($x-1,$y  ,&quot;{RIGHTCLICK}&quot;);
-	press($x+1,$y  ,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x-1,$y  ,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x+1,$y  ,&quot;{RIGHTCLICK}&quot;);
 
-	press($x-1,$y+1,&quot;{RIGHTCLICK}&quot;);
-	press($x  ,$y+1,&quot;{RIGHTCLICK}&quot;);
-	press($x+1,$y+1,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x-1,$y+1,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x  ,$y+1,&quot;{RIGHTCLICK}&quot;);
+	$this-&gt;press($x+1,$y+1,&quot;{RIGHTCLICK}&quot;);
 
 }
 
+=end deprecated
+
+=head2 game_over
+
+	if (my $state = $sweeperbot-&gt;game_over) {
+		print $state &gt; 0 ? &quot;We won!\n&quot; : &quot;We lost!\n&quot;;
+	}
+
+Checks to see if the game is over by looking at the minesweeper smiley.
+Returns C&lt;1&gt; for game over due to a win, C&lt;-1&gt; for game over due to
+a loss, and false if the game has not finished.
+
+=cut
+
 # Is the game over (we hit a mine)? 
 # Returns -1 if game is over and we lost, 0 if not over, 1 if over and we won
 sub game_over {
@@ -416,8 +574,6 @@ sub game_over {
 
     my $sig = $smiley-&gt;Get(&quot;signature&quot;);
 
-    # (5.10 new smileys first, then 5.10 smileys, then 5.8)
-    
     if (exists $smiley_type{$sig}) {
 	return $smiley_type{$sig};
     }
@@ -426,6 +582,42 @@ sub game_over {
 
 }
 
+=head2 make_move
+
+
+	$sweeperbot-&gt;make_move($game_state);
+
+Given a game state, determines the next move(s) that should be made,
+and makes them.  By default this uses a very simple process:
+
+=over
+
+=item *
+
+If C&lt;UBER_CHEAT&gt; is set, then cheat.
+
+=item *
+
+If we find a square where the number of adjacent mines matches the
+number on the square, L&lt;/stomp&gt; on it.
+
+=item *
+
+If the number of adjacent unpressed squares matches the number of 
+unknown adjacent mines, then flag them as mines.
+
+=item * 
+
+If all else fails, pick a square at random.  If C&lt;CHEAT&gt; is defined,
+and we would have picked a square with a mine, then pick another.
+
+=back
+
+If you want to inherit from this class to change the AI, overriding
+this method is the place to do it.
+
+=cut
+
 sub make_move {
 	my ($this, $game_state) = @_;
 	our ($squares_x, $squares_y);
@@ -435,10 +627,10 @@ sub make_move {
 
 			if (UBER_CHEAT) {
 				if (cheat_is_square_safe([$x,$y])) {
-					press($x,$y);
+					$this-&gt;press($x,$y);
 				}
 				else {
-					flag_mines($game_state,[$x,$y]);
+					$this-&gt;flag_mines($game_state,[$x,$y]);
 				}
 				$altered_board = 1;
 			}
@@ -449,19 +641,19 @@ sub make_move {
 			# Unpressed/flag squares don't give us any information.
 			next SQUARE if (not looks_like_number($game_state-&gt;[$x][$y]));
 
-			my @adjacent_unpressed = adjacent_unpressed_for($game_state,$x,$y);
+			my @adjacent_unpressed = $this-&gt;adjacent_unpressed_for($game_state,$x,$y);
 			# If there are no adjacent unpressed squares, then
 			# this square is boring.
 			next SQUARE if not @adjacent_unpressed;
 
-			my $adjacent_mines = adjacent_mines_for($game_state,$x,$y);
+			my $adjacent_mines = $this-&gt;adjacent_mines_for($game_state,$x,$y);
 
 			# If the number of mines is equal to the number
 			# on this square, then stomp on it.
 			
 			if ($adjacent_mines == $game_state-&gt;[$x][$y]) {
 				print &quot;Stomping on $x,$y\n&quot; if DEBUG;
-				stomp($x,$y);
+				$this-&gt;stomp($x,$y);
 				$altered_board = 1;
 			}
 
@@ -470,7 +662,7 @@ sub make_move {
 			# adjacent squares as having mines.
 			if ($adjacent_mines + @adjacent_unpressed == $game_state-&gt;[$x][$y]) {
 				print &quot;Marking mines next to $x,$y\n&quot; if DEBUG;
-				flag_mines($game_state,@adjacent_unpressed);
+				$this-&gt;flag_mines($game_state,@adjacent_unpressed);
 				$altered_board = 1;
 			}
 			
@@ -491,25 +683,42 @@ sub make_move {
 		my $square = $unpressed[rand @unpressed];
 
 		if (CHEAT) {
-			while (not cheat_is_square_safe($square)) {
+			while (not $this-&gt;cheat_is_square_safe($square)) {
 				$square = $unpressed[rand @unpressed];
 			}
 		}
 
 		print &quot;Guessing square &quot;,join(&quot;,&quot;,@$square),&quot;\n&quot; if DEBUG;
-		press(@$square);
+		$this-&gt;press(@$square);
 
 	}
 	return;
 }
 
+=head2 capture_game_state
+
+	my $game_state = $sweeperbot-&gt;capture_game_state;
+
+Walks over the entire board, capturing the value in each location and
+adding it to an array-of-arrays (game-state) structure.  The value
+in a particular square can be accessed with:
+
+	$value = $game_state-&gt;[$x][$y];
+
+Where (1,1) is considered the top-left of the game board.
+
+=cut
+
 sub capture_game_state {
+
+	my ($this) = @_;
+
 	my $game_state = [];
 	our ($squares_x, $squares_y);
 
 	for my $y (1..$squares_y) {
     		for my $x (1..$squares_x) {
-			my $square_value = value($x,$y);
+			my $square_value = $this-&gt;value($x,$y);
 			$game_state-&gt;[$x][$y] = $square_value;
 			print $char_for{$square_value} if DEBUG;
 		}
@@ -533,26 +742,57 @@ sub capture_game_state {
 	return $game_state;
 }
 
+=head2 adjacent_mines_for
+
+	my $mines = $sweeperbot-&gt;adjacent_mines_for($game_state, $x, $y);
+
+Examines all the squares adjacent to ($x,$y) and returns an
+array-ref of tuples for those that have already been flagged
+as a mine.
+
+=cut
+
 sub adjacent_mines_for {
-	my ($game_state,$x,$y) = @_;
-	return mines_at($game_state,
+	my ($this, $game_state, $x, $y) = @_;
+	return $this-&gt;mines_at($game_state,
 		[$x-1, $y-1],   [$x, $y-1],   [$x+1, $y-1],
 		[$x-1, $y  ],                 [$x+1, $y  ],
 		[$x-1, $y+1],   [$x, $y+1],   [$x+1, $y+1],
 	);
 }
 
+=head2 adjacent_unpressed_for
+
+	my $squares = $sweeperbot-&gt;adjacent_unpressed_for($game_state, $x, $y);
+
+Examines all the squares adjacent to ($x,$y) and returns an array-ref
+of tuples for those that have not been pressed (and not flagged as a
+mine).
+
+=cut
+
 sub adjacent_unpressed_for {
-	my ($game_state, $x, $y) = @_;
-	return unpressed_list($game_state,
+	my ($this, $game_state, $x, $y) = @_;
+	return $this-&gt;unpressed_list($game_state,
 		[$x-1, $y-1],   [$x, $y-1],   [$x+1, $y-1],
 		[$x-1, $y  ],                 [$x+1, $y  ],
 		[$x-1, $y+1],   [$x, $y+1],   [$x+1, $y+1],
 	);
 }
 
+=head2 mines_at
+
+	my $mines = $sweeperbot-&gt;mines_at($game_state, @locations);
+
+Takes a game state and a list of locations, and returns an array-ref
+containing those locations from the list that have been flagged as
+a mine.
+
+=cut
+
+
 sub mines_at {
-	my ($game_state, @locations) = @_;
+	my ($this, $game_state, @locations) = @_;
 
 	my $mines = 0;
 
@@ -564,22 +804,62 @@ sub mines_at {
 	return $mines;
 }
 
+=head2 unpressed_list
+
+	my $unpressed = $this-&gt;unpressed-list($game_state, @locations);
+
+Identical to L&lt;/mines_at&gt; above, but returns any locations that have
+not been pressed (and not flagged as a mine).
+
+=cut
+
 sub unpressed_list {
-	my ($game_state, @locations) = @_;
+	my ($this, $game_state, @locations) = @_;
 
 	my @unpressed = grep { ($game_state-&gt;[ $_-&gt;[0] ][ $_-&gt;[1] ] eq &quot;unpressed&quot;) } @locations;
 
 	return @unpressed;
 }
 
-# Technically this should end with a &quot;left-shift&quot;, but shift-space seems to work.
+=head2 enable_cheats
+
+	$sweeperbot-&gt;enable_cheats;
+
+Sends the magic C&lt;xyzzy&gt; cheat to minesweeper, which allows us to
+determine the contents of a square by examining the top-left pixel
+of the entire display.
+
+For this cheat to be used in the default AI, the C&lt;CHEAT&gt; constant
+must be set to a true value in the C&lt;App::SweeperBot&gt; source.
+
+=cut
 
 sub enable_cheats {
 	SendKeys(&quot;xyzzy{ENTER}+ &quot;);
+
+	return;
 }
 
+=head2 cheat_is_square_safe
+
+	if ($sweeperbot-&gt;cheat_is_square_safe($x,$y) {
+		print &quot;($x,$y) looks safe!\n&quot;;
+	} else {
+		print &quot;($x,$y) has a mine underneath.\n&quot;;
+	}
+
+If cheats are enabled, returns true if the given square looks
+safe to step on, or false if it appears to contain a mine.
+
+Note that especially on fast, multi-core systems, it's possible
+for this to move the mouse and capture the required pixel before
+minesweeper has had a chance to update it.  So if you cheat,
+you may sometimes be surprised.
+
+=cut
+
 sub cheat_is_square_safe {
-	my ($square) = @_;
+	my ($this, $square) = @_;
 	our($l,$t);
 	
 	MouseMoveAbsPix(
@@ -615,6 +895,10 @@ Use of this program may cause sweeperbot to take control of our
 mouse and keyboard, playing minesweeper endlessly for days on end,
 and forcing the user to go and do something productive instead.
 
+All methods that require a game-state to be passed will be modified
+in the future to be usable without the game-state.  The
+C&lt;App::SweeperBot&gt; object itself should be able to retain state.
+
 =head1 AUTHOR
 
 Paul Fenwick E&lt;lt&gt;pjf@cpan.orgE&lt;gt&gt;
@@ -624,7 +908,7 @@ Paul Fenwick E&lt;lt&gt;pjf@cpan.orgE&lt;gt&gt;
 Copyright (C) 2005-2008 by Paul Fenwick, E&lt;lt&gt;pjf@cpan.orgE&lt;gt&gt;
 
 Based upon original code Copyright (C) 2005 by 
-Matt Sparks E&lt;lt&gt;root@f0rked.comE&lt;lt&gt;
+Matt Sparks E&lt;lt&gt;root@f0rked.comE&lt;gt&gt;
 
 This application is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself, either Perl version 5.6.0</diff>
      <filename>lib/App/SweeperBot.pm</filename>
    </modified>
    <modified>
      <diff>@@ -36,20 +36,13 @@ sub module_boilerplate_ok {
     );
 }
 
-TODO: {
-  local $TODO = &quot;Need to replace the boilerplate text&quot;;
+not_in_file_ok(README =&gt;
+&quot;The README is used...&quot;       =&gt; qr/The README is used/,
+&quot;'version information here'&quot;  =&gt; qr/to provide version information/,
+);
 
-  not_in_file_ok(README =&gt;
-    &quot;The README is used...&quot;       =&gt; qr/The README is used/,
-    &quot;'version information here'&quot;  =&gt; qr/to provide version information/,
-  );
-
-  not_in_file_ok(Changes =&gt;
-    &quot;placeholder date/time&quot;       =&gt; qr(Date/time)
-  );
-
-  module_boilerplate_ok('lib/App/SweeperBot.pm');
-
-
-}
+not_in_file_ok(Changes =&gt;
+&quot;placeholder date/time&quot;       =&gt; qr(Date/time)
+);
 
+module_boilerplate_ok('lib/App/SweeperBot.pm');</diff>
      <filename>t/boilerplate.t</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>1b84197f781a4999b16b7002e0fecd10f21418ec</id>
    </parent>
  </parents>
  <author>
    <name>Paul Fenwick</name>
    <email>pjf@perltraining.com.au</email>
  </author>
  <url>http://github.com/pfenwick/sweeperbot/commit/8b8ac5a30132aa7a67a9be84edd39af9444293b1</url>
  <id>8b8ac5a30132aa7a67a9be84edd39af9444293b1</id>
  <committed-date>2008-05-23T22:13:54-07:00</committed-date>
  <authored-date>2008-05-23T22:13:54-07:00</authored-date>
  <message>Updated to use OO design.  Documented everything.</message>
  <tree>d8e08f9ee902b62987a2501d06cfc953aa8bfd71</tree>
  <committer>
    <name>Paul Fenwick</name>
    <email>pjf@perltraining.com.au</email>
  </committer>
</commit>
