#!/usr/bin/perl
use 5.016;
use warnings;
use Time::Piece;

sub slice {
	my ($n, $r, @l) = @_;

	return (@l ? slice($n, [@{$r}, [@l[0 .. $n - 1]]], @l[$n .. $#l]) : @{$r});
}

sub calendar {
	my ($y, $m, $sub) = @_;

	return sub {
		slice(7, [], (
			map{ $sub->($_) }
				((0) x $_[0]->day_of_week),
				(1 .. $_[0]->month_last_day),
				((0) x (7 - ($_[0]->day_of_week + $_[0]->month_last_day) % 7))
		))
	}->(Time::Piece->strptime("$y-$m-1", "%Y-%m-%d"));
}

foreach(calendar(2014, 2, sub{ $_[0] ? sprintf("%2d ", $_[0]) : "   " })){
	say @{$_};
}
