[Bps-public-commit] Data-ICal branch, master, updated. 0.22

Alex Vandiver alexmv at bestpractical.com
Tue Feb 17 02:26:52 EST 2015


The branch, master has been updated
       via  f8df6b71dbef08a10db76c085bd9ae90ce6730a9 (commit)
       via  25db85e588f2567d89dca949901c183f12282346 (commit)
       via  21a7c7fb4ba8ca0a4590a1e891d8c0fb6369327e (commit)
       via  bedf2a48656087c67383b77c12042528c15040dd (commit)
       via  a357b3e1ff989586c7b78d3279262480e985e4ab (commit)
       via  d31a5bd315bdc5c6b6504f7bceff7598f661ff10 (commit)
       via  81ad6df3ef3c96d2fe6cbd5a53f6a56de0d0d189 (commit)
       via  b0bcdbeb8b56d8e8509ca0415b78c4de4fbddb73 (commit)
       via  30402a1fe3480bb09085ead6b1717b8734694cd9 (commit)
       via  1dd269f1acf949703e01d5f160ae4bc980a7aa60 (commit)
       via  e7422ca9341a966f1fd364614dc515d1e9bac75a (commit)
       via  96a27a27a4c1ce949cc45c8f14bfc0fd7e4588d3 (commit)
      from  fe68eb3921e733c772974cfabcab4181aa4aa502 (commit)

Summary of changes:
 .gitignore                               |  11 +-
 Changes                                  | 190 ++++++++++++++-----------------
 MANIFEST                                 |   4 +
 MANIFEST.SKIP                            |  19 ----
 META.yml                                 |   6 +-
 Makefile.PL                              |   2 +-
 inc/Module/AutoInstall.pm                |  42 +++----
 inc/Module/Install.pm                    |  22 ++--
 inc/Module/Install/AutoInstall.pm        |   2 +-
 inc/Module/Install/Base.pm               |   2 +-
 inc/Module/Install/Can.pm                |   2 +-
 inc/Module/Install/Fetch.pm              |   2 +-
 inc/Module/Install/Include.pm            |   2 +-
 inc/Module/Install/Makefile.pm           |   4 +-
 inc/Module/Install/Metadata.pm           |   6 +-
 inc/Module/Install/Win32.pm              |   2 +-
 inc/Module/Install/WriteAll.pm           |   2 +-
 lib/Data/ICal.pm                         |  76 ++++++-------
 lib/Data/ICal/Entry.pm                   |  97 +++++++++-------
 lib/Data/ICal/Entry/Alarm.pm             | 101 ++++++++++++++++
 lib/Data/ICal/Entry/Alarm/Audio.pm       |  74 ++----------
 lib/Data/ICal/Entry/Alarm/Display.pm     |  72 ++----------
 lib/Data/ICal/Entry/Alarm/Email.pm       |  73 ++----------
 lib/Data/ICal/Entry/Alarm/None.pm        |  63 ++++++++++
 lib/Data/ICal/Entry/Alarm/Procedure.pm   |  71 +++---------
 lib/Data/ICal/Entry/Alarm/URI.pm         |  83 ++++++++++++++
 lib/Data/ICal/Entry/Event.pm             |  69 +++++------
 lib/Data/ICal/Entry/FreeBusy.pm          |  54 ++++-----
 lib/Data/ICal/Entry/Journal.pm           |  62 +++++-----
 lib/Data/ICal/Entry/TimeZone.pm          |  33 +-----
 lib/Data/ICal/Entry/TimeZone/Daylight.pm |  33 +-----
 lib/Data/ICal/Entry/TimeZone/Standard.pm |  33 +-----
 lib/Data/ICal/Entry/Todo.pm              |  53 ++++-----
 lib/Data/ICal/Property.pm                |  29 +----
 34 files changed, 653 insertions(+), 743 deletions(-)
 delete mode 100644 MANIFEST.SKIP
 create mode 100644 lib/Data/ICal/Entry/Alarm.pm
 create mode 100644 lib/Data/ICal/Entry/Alarm/None.pm
 create mode 100644 lib/Data/ICal/Entry/Alarm/URI.pm

- Log -----------------------------------------------------------------
commit 96a27a27a4c1ce949cc45c8f14bfc0fd7e4588d3
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Mon Feb 16 23:20:15 2015 -0500

    Update inc/

diff --git a/META.yml b/META.yml
index a701e02..9d80820 100644
--- a/META.yml
+++ b/META.yml
@@ -12,7 +12,7 @@ configure_requires:
   ExtUtils::MakeMaker: 6.36
 distribution_type: module
 dynamic_config: 1
-generated_by: 'Module::Install version 1.06'
+generated_by: 'Module::Install version 1.14'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -30,4 +30,4 @@ requires:
   Text::vFile::asData: 0
 resources:
   license: http://dev.perl.org/licenses/
-version: 0.21
+version: '0.21'
diff --git a/inc/Module/AutoInstall.pm b/inc/Module/AutoInstall.pm
index aa7aa92..cd93d14 100644
--- a/inc/Module/AutoInstall.pm
+++ b/inc/Module/AutoInstall.pm
@@ -8,7 +8,7 @@ use ExtUtils::MakeMaker ();
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 }
 
 # special map on pre-defined feature sets
@@ -115,7 +115,7 @@ sub import {
     print "*** $class version " . $class->VERSION . "\n";
     print "*** Checking for Perl dependencies...\n";
 
-    my $cwd = Cwd::cwd();
+    my $cwd = Cwd::getcwd();
 
     $Config = [];
 
@@ -166,7 +166,7 @@ sub import {
         $modules = [ %{$modules} ] if UNIVERSAL::isa( $modules, 'HASH' );
 
         unshift @$modules, -default => &{ shift(@$modules) }
-          if ( ref( $modules->[0] ) eq 'CODE' );    # XXX: bugward combatability
+          if ( ref( $modules->[0] ) eq 'CODE' );    # XXX: bugward compatibility
 
         while ( my ( $mod, $arg ) = splice( @$modules, 0, 2 ) ) {
             if ( $mod =~ m/^-(\w+)$/ ) {
@@ -345,22 +345,26 @@ sub install {
     my $i;    # used below to strip leading '-' from config keys
     my @config = ( map { s/^-// if ++$i; $_ } @{ +shift } );
 
-    my ( @modules, @installed );
-    while ( my ( $pkg, $ver ) = splice( @_, 0, 2 ) ) {
+	my ( @modules, @installed, @modules_to_upgrade );
+	while (my ($pkg, $ver) = splice(@_, 0, 2)) {
 
-        # grep out those already installed
-        if ( _version_cmp( _version_of($pkg), $ver ) >= 0 ) {
-            push @installed, $pkg;
-        }
-        else {
-            push @modules, $pkg, $ver;
-        }
-    }
+		# grep out those already installed
+		if (_version_cmp(_version_of($pkg), $ver) >= 0) {
+			push @installed, $pkg;
+			if ($UpgradeDeps) {
+				push @modules_to_upgrade, $pkg, $ver;
+			}
+		}
+		else {
+			push @modules, $pkg, $ver;
+		}
+	}
 
-    if ($UpgradeDeps) {
-        push @modules, @installed;
-        @installed = ();
-    }
+	if ($UpgradeDeps) {
+		push @modules, @modules_to_upgrade;
+		@installed          = ();
+		@modules_to_upgrade = ();
+	}
 
     return @installed unless @modules;  # nothing to do
     return @installed if _check_lock(); # defer to the CPAN shell
@@ -611,7 +615,7 @@ sub _under_cpan {
     require Cwd;
     require File::Spec;
 
-    my $cwd  = File::Spec->canonpath( Cwd::cwd() );
+    my $cwd  = File::Spec->canonpath( Cwd::getcwd() );
     my $cpan = File::Spec->canonpath( $CPAN::Config->{cpan_home} );
 
     return ( index( $cwd, $cpan ) > -1 );
@@ -927,4 +931,4 @@ END_MAKE
 
 __END__
 
-#line 1193
+#line 1197
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm
index 4ecf46b..ff767fa 100644
--- a/inc/Module/Install.pm
+++ b/inc/Module/Install.pm
@@ -17,7 +17,7 @@ package Module::Install;
 #     3. The ./inc/ version of Module::Install loads
 # }
 
-use 5.005;
+use 5.006;
 use strict 'vars';
 use Cwd        ();
 use File::Find ();
@@ -31,7 +31,7 @@ BEGIN {
 	# This is not enforced yet, but will be some time in the next few
 	# releases once we can make sure it won't clash with custom
 	# Module::Install extensions.
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 
 	# Storage for the pseudo-singleton
 	$MAIN    = undef;
@@ -156,10 +156,10 @@ END_DIE
 sub autoload {
 	my $self = shift;
 	my $who  = $self->_caller;
-	my $cwd  = Cwd::cwd();
+	my $cwd  = Cwd::getcwd();
 	my $sym  = "${who}::AUTOLOAD";
 	$sym->{$cwd} = sub {
-		my $pwd = Cwd::cwd();
+		my $pwd = Cwd::getcwd();
 		if ( my $code = $sym->{$pwd} ) {
 			# Delegate back to parent dirs
 			goto &$code unless $cwd eq $pwd;
@@ -239,7 +239,7 @@ sub new {
 
 	# ignore the prefix on extension modules built from top level.
 	my $base_path = Cwd::abs_path($FindBin::Bin);
-	unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) {
+	unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) {
 		delete $args{prefix};
 	}
 	return $args{_self} if $args{_self};
@@ -338,7 +338,7 @@ sub find_extensions {
 		if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) {
 			my $content = Module::Install::_read($subpath . '.pm');
 			my $in_pod  = 0;
-			foreach ( split //, $content ) {
+			foreach ( split /\n/, $content ) {
 				$in_pod = 1 if /^=\w/;
 				$in_pod = 0 if /^=cut/;
 				next if ($in_pod || /^=cut/);  # skip pod text
@@ -378,6 +378,7 @@ eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@;
 sub _read {
 	local *FH;
 	open( FH, '<', $_[0] ) or die "open($_[0]): $!";
+	binmode FH;
 	my $string = do { local $/; <FH> };
 	close FH or die "close($_[0]): $!";
 	return $string;
@@ -386,6 +387,7 @@ END_NEW
 sub _read {
 	local *FH;
 	open( FH, "< $_[0]"  ) or die "open($_[0]): $!";
+	binmode FH;
 	my $string = do { local $/; <FH> };
 	close FH or die "close($_[0]): $!";
 	return $string;
@@ -416,6 +418,7 @@ eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@;
 sub _write {
 	local *FH;
 	open( FH, '>', $_[0] ) or die "open($_[0]): $!";
+	binmode FH;
 	foreach ( 1 .. $#_ ) {
 		print FH $_[$_] or die "print($_[0]): $!";
 	}
@@ -425,6 +428,7 @@ END_NEW
 sub _write {
 	local *FH;
 	open( FH, "> $_[0]"  ) or die "open($_[0]): $!";
+	binmode FH;
 	foreach ( 1 .. $#_ ) {
 		print FH $_[$_] or die "print($_[0]): $!";
 	}
@@ -434,7 +438,7 @@ END_OLD
 
 # _version is for processing module versions (eg, 1.03_05) not
 # Perl versions (eg, 5.8.1).
-sub _version ($) {
+sub _version {
 	my $s = shift || 0;
 	my $d =()= $s =~ /(\.)/g;
 	if ( $d >= 2 ) {
@@ -450,12 +454,12 @@ sub _version ($) {
 	return $l + 0;
 }
 
-sub _cmp ($$) {
+sub _cmp {
 	_version($_[1]) <=> _version($_[2]);
 }
 
 # Cloned from Params::Util::_CLASS
-sub _CLASS ($) {
+sub _CLASS {
 	(
 		defined $_[0]
 		and
diff --git a/inc/Module/Install/AutoInstall.pm b/inc/Module/Install/AutoInstall.pm
index 6efe4fe..475303e 100644
--- a/inc/Module/Install/AutoInstall.pm
+++ b/inc/Module/Install/AutoInstall.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm
index 802844a..4206347 100644
--- a/inc/Module/Install/Base.pm
+++ b/inc/Module/Install/Base.pm
@@ -4,7 +4,7 @@ package Module::Install::Base;
 use strict 'vars';
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 }
 
 # Suspend handler for "redefined" warnings
diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm
index 22167b8..9929b1b 100644
--- a/inc/Module/Install/Can.pm
+++ b/inc/Module/Install/Can.pm
@@ -8,7 +8,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm
index bee0c4f..3d8de76 100644
--- a/inc/Module/Install/Fetch.pm
+++ b/inc/Module/Install/Fetch.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Include.pm b/inc/Module/Install/Include.pm
index 8310e4c..f274f87 100644
--- a/inc/Module/Install/Include.pm
+++ b/inc/Module/Install/Include.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm
index 7052f36..66993af 100644
--- a/inc/Module/Install/Makefile.pm
+++ b/inc/Module/Install/Makefile.pm
@@ -8,7 +8,7 @@ use Fcntl qw/:flock :seek/;
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
@@ -133,7 +133,7 @@ sub makemaker_args {
 	return $args;
 }
 
-# For mm args that take multiple space-seperated args,
+# For mm args that take multiple space-separated args,
 # append an argument to the current list.
 sub makemaker_append {
 	my $self = shift;
diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm
index 58430f3..e547fa0 100644
--- a/inc/Module/Install/Metadata.pm
+++ b/inc/Module/Install/Metadata.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
@@ -347,7 +347,7 @@ sub name_from {
 		^ \s*
 		package \s*
 		([\w:]+)
-		\s* ;
+		[\s|;]*
 		/ixms
 	) {
 		my ($name, $module_name) = ($1, $1);
@@ -705,7 +705,7 @@ sub _write_mymeta_data {
 	my @yaml = Parse::CPAN::Meta::LoadFile('META.yml');
 	my $meta = $yaml[0];
 
-	# Overwrite the non-configure dependency hashs
+	# Overwrite the non-configure dependency hashes
 	delete $meta->{requires};
 	delete $meta->{build_requires};
 	delete $meta->{recommends};
diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm
index eeaa3fe..9706e5f 100644
--- a/inc/Module/Install/Win32.pm
+++ b/inc/Module/Install/Win32.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm
index 85d8018..dbedc00 100644
--- a/inc/Module/Install/WriteAll.pm
+++ b/inc/Module/Install/WriteAll.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.06';
+	$VERSION = '1.14';
 	@ISA     = qw{Module::Install::Base};
 	$ISCORE  = 1;
 }

commit e7422ca9341a966f1fd364614dc515d1e9bac75a
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 00:06:38 2015 -0500

    Refactor common properties of alarms into Data::ICal::Entry::Alarm

diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index dde250c..d959c24 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -285,8 +285,6 @@ calendars only).
 The only property encoding supported by L<Data::ICal> is quoted
 printable.
 
-There is no L<Data::ICal::Entry::Alarm> base class.
-
 Please report any bugs or feature requests to
 C<bug-data-ical at rt.cpan.org>, or through the web interface at
 L<http://rt.cpan.org>.
diff --git a/lib/Data/ICal/Entry/Alarm/Display.pm b/lib/Data/ICal/Entry/Alarm.pm
similarity index 62%
copy from lib/Data/ICal/Entry/Alarm/Display.pm
copy to lib/Data/ICal/Entry/Alarm.pm
index 455768e..1fbf38b 100644
--- a/lib/Data/ICal/Entry/Alarm/Display.pm
+++ b/lib/Data/ICal/Entry/Alarm.pm
@@ -1,32 +1,32 @@
 use warnings;
 use strict;
 
-package Data::ICal::Entry::Alarm::Display;
+package Data::ICal::Entry::Alarm;
 
 use base qw/Data::ICal::Entry/;
 
 =head1 NAME
 
-Data::ICal::Entry::Alarm::Display - Represents a displayed alarm in an iCalendar file
+Data::ICal::Entry::Alarm - Abstract base class for alarms
 
-=head1 SYNOPSIS
+=head1 DESCRIPTION
 
-    my $valarm = Data::ICal::Entry::Alarm::Display->new();
-    $valarm->add_properties(
-        description => "Wake up!",
-	# Dat*e*::ICal is not a typo here
-        trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
-    );
+L<Data::ICal::Entry::Alarm> is an abstract base class for the other type
+of supported by alarms:
 
-    $vevent->add_entry($valarm);
+=over
 
-=head1 DESCRIPTION
+=item L<Data::ICal::Entry::Alarm::Audio>
+
+=item L<Data::ICal::Entry::Alarm::Display>
 
-A L<Data::ICal::Entry::Alarm::Display> object represents a alarm that
-displays a message which is attached to a todo item or event in an
-iCalendar file.  (Note that the iCalendar RFC refers to entries as
-"components".)  It is a subclass of L<Data::ICal::Entry> and accepts
-all of its methods.
+=item L<Data::ICal::Entry::Alarm::Email>
+
+=item L<Data::ICal::Entry::Alarm::Procedure>
+
+=back
+
+It is a subclass of L<Data::ICal::Entry> and accepts all of its methods.
 
 =head1 METHODS
 
@@ -34,15 +34,14 @@ all of its methods.
 
 =head2 new
 
-Creates a new L<Data::ICal::Entry::Alarm::Display> object; sets its
-C<ACTION> property to C<DISPLAY>.
 
 =cut
 
 sub new {
     my $class = shift;
     my $self  = $class->SUPER::new(@_);
-    $self->add_property( action => "DISPLAY" );
+    die "Can't instantiate abstract base class Data::ICal::Entry::Alarm"
+        if $class eq __PACKAGE__;
     return $self;
 }
 
@@ -57,9 +56,9 @@ sub ical_entry_type {'VALARM'}
 =head2 optional_unique_properties
 
 According to the iCalendar standard, the C<duration> and C<retreat>
-properties may be specified at most one time for an displayed alarm,
-and if one is specified, the other one must be also, though this
-module does not enforce that restriction.
+properties may be specified at most one time all types of alarms; if one
+is specified, the other one must be also, though this module does not
+enforce that restriction.
 
 =cut
 
@@ -71,16 +70,18 @@ sub optional_unique_properties {
 
 =head2 mandatory_unique_properties
 
-According to the iCalendar standard, the C<trigger> and C<description>
-properties must be specified exactly once for an displayed alarm.  (In
-addition, the C<action> property must be specified exactly once, but
-the module automatically sets it for you.)
+According to the iCalendar standard, the C<trigger> property must be
+specified exactly once for an all types of alarms; subclasses may have
+additional required properties.
+
+In addition, the C<action> property must be specified exactly once, but
+all subclasses automatically set said property appropriately.
 
 =cut
 
 sub mandatory_unique_properties {
     qw(
-        action trigger description
+        action trigger
     );
 }
 
diff --git a/lib/Data/ICal/Entry/Alarm/Audio.pm b/lib/Data/ICal/Entry/Alarm/Audio.pm
index bcbbcc0..c7f5029 100644
--- a/lib/Data/ICal/Entry/Alarm/Audio.pm
+++ b/lib/Data/ICal/Entry/Alarm/Audio.pm
@@ -3,7 +3,7 @@ use strict;
 
 package Data::ICal::Entry::Alarm::Audio;
 
-use base qw/Data::ICal::Entry/;
+use base qw/Data::ICal::Entry::Alarm/;
 
 =head1 NAME
 
@@ -25,7 +25,7 @@ Data::ICal::Entry::Alarm::Audio - Represents an audio alarm in an iCalendar file
 A L<Data::ICal::Entry::Alarm::Audio> object represents an audio alarm
 attached to a todo item or event in an iCalendar file.  (Note that the
 iCalendar RFC refers to entries as "components".)  It is a subclass of
-L<Data::ICal::Entry> and accepts all of its methods.
+L<Data::ICal::Entry::Alarm> and accepts all of its methods.
 
 =head1 METHODS
 
@@ -45,45 +45,18 @@ sub new {
     return $self;
 }
 
-=head2 ical_entry_type
-
-Returns C<VALARM>, its iCalendar entry name.
-
-=cut
-
-sub ical_entry_type {'VALARM'}
-
 =head2 optional_unique_properties
 
-According to the iCalendar standard, the following properties may be
-specified at most one time for an audio alarm:
-
-	duration repeat attach
-
-Note that if one of C<duration> or C<repeat> is specified, the other
-one must be also, though this module does not enforce that
-restriction.
+In addition to C<duration> and C<repeat> (see
+L<Data::ICal::Entry::Alarm/optional_unique_properties>), audio alarms
+may specify a value for C<attach>.
 
 =cut
 
 sub optional_unique_properties {
-    qw(
-        duration repeat attach
-    );
-}
-
-=head2 mandatory_unique_properties
-
-According to the iCalendar standard, the C<trigger> property must be
-specified exactly once for an audio alarm.  (In addition, the
-C<action> property must be specified exactly once, but the module
-automatically sets it for you.)
-
-=cut
-
-sub mandatory_unique_properties {
-    qw(
-        action trigger
+    return (
+        shift->SUPER::optional_unique_properties,
+        "attach",
     );
 }
 
diff --git a/lib/Data/ICal/Entry/Alarm/Display.pm b/lib/Data/ICal/Entry/Alarm/Display.pm
index 455768e..cf15cc8 100644
--- a/lib/Data/ICal/Entry/Alarm/Display.pm
+++ b/lib/Data/ICal/Entry/Alarm/Display.pm
@@ -3,7 +3,7 @@ use strict;
 
 package Data::ICal::Entry::Alarm::Display;
 
-use base qw/Data::ICal::Entry/;
+use base qw/Data::ICal::Entry::Alarm/;
 
 =head1 NAME
 
@@ -25,8 +25,8 @@ Data::ICal::Entry::Alarm::Display - Represents a displayed alarm in an iCalendar
 A L<Data::ICal::Entry::Alarm::Display> object represents a alarm that
 displays a message which is attached to a todo item or event in an
 iCalendar file.  (Note that the iCalendar RFC refers to entries as
-"components".)  It is a subclass of L<Data::ICal::Entry> and accepts
-all of its methods.
+"components".)  It is a subclass of L<Data::ICal::Entry::Alarm> and
+accepts all of its methods.
 
 =head1 METHODS
 
@@ -46,41 +46,18 @@ sub new {
     return $self;
 }
 
-=head2 ical_entry_type
-
-Returns C<VALARM>, its iCalendar entry name.
-
-=cut
-
-sub ical_entry_type {'VALARM'}
-
-=head2 optional_unique_properties
-
-According to the iCalendar standard, the C<duration> and C<retreat>
-properties may be specified at most one time for an displayed alarm,
-and if one is specified, the other one must be also, though this
-module does not enforce that restriction.
-
-=cut
-
-sub optional_unique_properties {
-    qw(
-        duration repeat
-    );
-}
-
 =head2 mandatory_unique_properties
 
-According to the iCalendar standard, the C<trigger> and C<description>
-properties must be specified exactly once for an displayed alarm.  (In
-addition, the C<action> property must be specified exactly once, but
-the module automatically sets it for you.)
+In addition to C<action> and C<trigger> (see
+L<Data::ICal::Entry::Alarm/mandatory_unique_properties>), displayed
+alarms must also specify a value for C<description>.
 
 =cut
 
 sub mandatory_unique_properties {
-    qw(
-        action trigger description
+    return (
+        shift->SUPER::mandatory_unique_properties,
+        "description",
     );
 }
 
diff --git a/lib/Data/ICal/Entry/Alarm/Email.pm b/lib/Data/ICal/Entry/Alarm/Email.pm
index a0b4c70..550e080 100644
--- a/lib/Data/ICal/Entry/Alarm/Email.pm
+++ b/lib/Data/ICal/Entry/Alarm/Email.pm
@@ -3,7 +3,7 @@ use strict;
 
 package Data::ICal::Entry::Alarm::Email;
 
-use base qw/Data::ICal::Entry/;
+use base qw/Data::ICal::Entry::Alarm/;
 
 =head1 NAME
 
@@ -25,7 +25,7 @@ Data::ICal::Entry::Alarm::Email - Represents an emailed alarm in an iCalendar fi
 A L<Data::ICal::Entry::Alarm::Email> object represents an emailed
 alarm attached to a todo item or event in an iCalendar file.  (Note
 that the iCalendar RFC refers to entries as "components".)  It is a
-subclass of L<Data::ICal::Entry> and accepts all of its methods.
+subclass of L<Data::ICal::Entry::Alarm> and accepts all of its methods.
 
 The C<attendee> properties are intended as the recipient list of the
 email; the C<summary> as its subject; the C<description> as its body;
@@ -49,44 +49,18 @@ sub new {
     return $self;
 }
 
-=head2 ical_entry_type
-
-Returns C<VALARM>, its iCalendar entry name.
-
-=cut
-
-sub ical_entry_type {'VALARM'}
-
-=head2 optional_unique_properties
-
-According to the iCalendar standard, the C<duration> and C<retreat>
-properties may be specified at most one time for an emailed alarm, and
-if one is specified, the other one must be also, though this module
-does not enforce that restriction.
-
-=cut
-
-sub optional_unique_properties {
-    qw(
-        duration repeat
-    );
-}
-
 =head2 mandatory_unique_properties
 
-According to the iCalendar standard, the following properties must be
-specified exactly once for an emailed alarm:
-
-  description summary trigger
-
-In addition, the C<action> property must be specified exactly once,
-but the module automatically sets it for you.
+In addition to C<action> and C<trigger> (see
+L<Data::ICal::Entry::Alarm/mandatory_unique_properties>), emailed alarms
+must also specify a value for C<description> and C<summary>.
 
 =cut
 
 sub mandatory_unique_properties {
-    qw(
-        action description summary trigger
+    return (
+        shift->SUPER::mandatory_unique_properties,
+        "description", "summary",
     );
 }
 
diff --git a/lib/Data/ICal/Entry/Alarm/Procedure.pm b/lib/Data/ICal/Entry/Alarm/Procedure.pm
index 661855e..0403313 100644
--- a/lib/Data/ICal/Entry/Alarm/Procedure.pm
+++ b/lib/Data/ICal/Entry/Alarm/Procedure.pm
@@ -3,7 +3,7 @@ use strict;
 
 package Data::ICal::Entry::Alarm::Procedure;
 
-use base qw/Data::ICal::Entry/;
+use base qw/Data::ICal::Entry::Alarm/;
 
 =head1 NAME
 
@@ -26,7 +26,7 @@ A L<Data::ICal::Entry::Alarm::Procedure> object represents an alarm
 that calls a procedure (in some application-defined way), which is
 attached to a todo item or event in an iCalendar file.  (Note that the
 iCalendar RFC refers to entries as "components".)  It is a subclass of
-L<Data::ICal::Entry> and accepts all of its methods.
+L<Data::ICal::Entry::Alarm> and accepts all of its methods.
 
 =head1 METHODS
 
@@ -46,45 +46,33 @@ sub new {
     return $self;
 }
 
-=head2 ical_entry_type
-
-Returns C<VALARM>, its iCalendar entry name.
-
-=cut
-
-sub ical_entry_type {'VALARM'}
-
 =head2 optional_unique_properties
 
-According to the iCalendar standard, the following properties may be
-specified at most one time for a procedure-call alarm:
-
-	duration repeat description
-
-Note that if one of C<duration> or C<repeat> is specified, the other
-one must be also, though this module does not enforce that
-restriction.
+In addition to C<duration> and C<repeat> (see
+L<Data::ICal::Entry::Alarm/optional_unique_properties>), procedure-call
+alarms may also specify a value for C<description>.
 
 =cut
 
 sub optional_unique_properties {
-    qw(
-        duration repeat description
+    return (
+        shift->SUPER::optional_unique_properties,
+        "description",
     );
 }
 
 =head2 mandatory_unique_properties
 
-According to the iCalendar standard, the C<trigger> and C<attach>
-properties must be specified exactly once for a procedure-call alarm.
-(In addition, the C<action> property must be specified exactly once,
-but the module automatically sets it for you.)
+In addition to C<action> and C<trigger> (see
+L<Data::ICal::Entry::Alarm/mandatory_unique_properties>), procedure-call
+alarms must also specify a value for C<attach>.
 
 =cut
 
 sub mandatory_unique_properties {
-    qw(
-        action trigger attach
+    return (
+        shift->SUPER::mandatory_unique_properties,
+        "attach",
     );
 }
 

commit 1dd269f1acf949703e01d5f160ae4bc980a7aa60
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 00:17:23 2015 -0500

    Add URI and NONE alarm types, for compatibility with Apple ICal
    
    Added by https://tools.ietf.org/html/draft-daboo-valarm-extensions-04
    and seen in use in the wild.

diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index 15a7b0f..05277ea 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -511,6 +511,8 @@ my %_action_map = (
     DISPLAY   => 'Display',
     EMAIL     => 'Email',
     PROCEDURE => 'Procedure',
+    NONE      => 'None',
+    URI       => 'URI',
 );
 
 # alarms have actions
diff --git a/lib/Data/ICal/Entry/Alarm/None.pm b/lib/Data/ICal/Entry/Alarm/None.pm
new file mode 100644
index 0000000..58af724
--- /dev/null
+++ b/lib/Data/ICal/Entry/Alarm/None.pm
@@ -0,0 +1,88 @@
+use warnings;
+use strict;
+
+package Data::ICal::Entry::Alarm::None;
+
+use base qw/Data::ICal::Entry::Alarm/;
+
+=head1 NAME
+
+Data::ICal::Entry::Alarm::None - Represents an default no-op alarm
+
+=head1 SYNOPSIS
+
+    my $valarm = Data::ICal::Entry::Alarm::None->new();
+    $vevent->add_entry($valarm);
+
+=head1 DESCRIPTION
+
+A L<Data::ICal::Entry::Alarm::None> object represents a default alarm
+that does nothing; this is different from a lack of alarm, because
+clients may be expected to "override" any default alarm present in
+calendar data with the current value retrieved from the server.  This
+class is a subclass of L<Data::ICal::Entry::Alarm> and accepts all of
+its methods.
+
+This element is not included in the official iCal RFC, but is rather an
+unaccepted draft standard; see
+L<https://tools.ietf.org/html/draft-daboo-valarm-extensions-04#section-11>
+B<Its interoperability and support is thus limited.> This is alarm type
+is primarily used by Apple.
+
+=head1 METHODS
+
+=cut
+
+=head2 new
+
+Creates a new L<Data::ICal::Entry::Alarm::None> object; sets its
+C<ACTION> property to C<NONE>.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $self  = $class->SUPER::new(@_);
+    $self->add_property( action => "NONE" );
+    return $self;
+}
+
+=head1 AUTHOR
+
+Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
+Simon Wistow, and Alex Vandiver
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+
+=head1 DISCLAIMER OF WARRANTY
+
+BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
+YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR, OR CORRECTION.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
+LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+=cut
+
+1;
diff --git a/lib/Data/ICal/Entry/Alarm/URI.pm b/lib/Data/ICal/Entry/Alarm/URI.pm
new file mode 100644
index 0000000..e9101f5
--- /dev/null
+++ b/lib/Data/ICal/Entry/Alarm/URI.pm
@@ -0,0 +1,108 @@
+use warnings;
+use strict;
+
+package Data::ICal::Entry::Alarm::URI;
+
+use base qw/Data::ICal::Entry::Alarm/;
+
+=head1 NAME
+
+Data::ICal::Entry::Alarm::URI - Represents notification via a custom URI
+
+=head1 SYNOPSIS
+
+    my $valarm = Data::ICal::Entry::Alarm::URI->new();
+    $valarm->add_properties(
+        uri => "sms:+15105550101?body=hello%20there",
+	# Dat*e*::ICal is not a typo here
+        trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
+    );
+
+    $vevent->add_entry($valarm);
+
+=head1 DESCRIPTION
+
+A L<Data::ICal::Entry::Alarm::URI> object represents an alarm that
+notifies via arbitrary URI which is attached to a todo item or event in
+an iCalendar file.  (Note that the iCalendar RFC refers to entries as
+"components".)  It is a subclass of L<Data::ICal::Entry::Alarm> and
+accepts all of its methods.
+
+This element is not included in the official iCal RFC, but is rather an
+unaccepted draft standard; see
+L<https://tools.ietf.org/html/draft-daboo-valarm-extensions-04#section-6>
+B<Its interoperability and support is thus limited.> This is alarm type
+is primarily used by Apple.
+
+=head1 METHODS
+
+=cut
+
+=head2 new
+
+Creates a new L<Data::ICal::Entry::Alarm::Alarm> object; sets its
+C<ACTION> property to C<NONE>.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $self  = $class->SUPER::new(@_);
+    $self->add_property( action => "URI" );
+    return $self;
+}
+
+=head2 mandatory_unique_properties
+
+In addition to C<action> and C<trigger> (see
+L<Data::ICal::Entry::Alarm/mandatory_unique_properties>), uri alarms
+must also specify a value for C<uri>.
+
+=cut
+
+sub mandatory_unique_properties {
+    return (
+        shift->SUPER::mandatory_unique_properties,
+        "uri",
+    );
+}
+
+=head1 AUTHOR
+
+Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
+Simon Wistow, and Alex Vandiver
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+
+=head1 DISCLAIMER OF WARRANTY
+
+BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
+YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR, OR CORRECTION.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
+LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+=cut
+
+1;

commit 30402a1fe3480bb09085ead6b1717b8734694cd9
Author: Nathan Bailey <nathan.bailey at monash.edu>
Date:   Tue Feb 17 01:47:03 2015 -0500

    Add support for the common "x-wr-calname" property

diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index d959c24..a826cf3 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -52,7 +52,7 @@ methods applicable to L<Data::ICal>.
 
 =cut
 
-=head2 new [ data => $data, ] [ filename => $file ], [ vcal10 => $bool ]
+=head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ]
 
 Creates a new L<Data::ICal> object. 
 
@@ -61,9 +61,14 @@ content of the file or string into the object.  If the C<vcal10> flag is passed,
 parses it according to vCalendar 1.0, not iCalendar 2.0; this in particular impacts
 the parsing of continuation lines in quoted-printable sections.
 
-If a filename or data argument is not passed, this just sets its C<VERSION> and
-C<PRODID> properties to "2.0" (or "1.0" if the C<vcal10> flag is passed) and
-the value of the C<product_id> method respectively.
+If a calname is passed, sets x-wr-calname to the given string.  Although
+not specified in RFC2445, most calendar software respects x-wr-calname
+as the displayed name of the calendar.
+
+If a filename or data argument is not passed, this just sets the
+object's C<VERSION> and C<PRODID> properties to "2.0" (or "1.0" if the
+C<vcal10> flag is passed) and the value of the C<product_id> method
+respectively.
 
 Returns a false value upon failure to open or parse the file or data; this false
 value is a L<Class::ReturnValue> object and can be queried as to its 
@@ -77,6 +82,7 @@ sub new {
 
     my %args = (
         filename => undef,
+        calname  => undef,
         data     => undef,
         vcal10   => 0,
         @_
@@ -93,6 +99,9 @@ sub new {
             version => ( $self->vcal10 ? '1.0' : '2.0' ),
             prodid => $self->product_id,
         );
+        $self->add_property('x-wr-calname' => $args{calname})
+            if defined $args{calname};
+
         return $self;
     }
 }

commit b0bcdbeb8b56d8e8509ca0415b78c4de4fbddb73
Author: Nathan Bailey <nathan.bailey at monash.edu>
Date:   Tue Feb 17 01:49:20 2015 -0500

    Enforce RFC strictness if asked for; UID is mandatory
    
    RFC5545[1] states that the UID property is required for VEVENT, VTODO,
    VJOURNAL, and VFREEBUSY components; Data::ICal did not enforce this.
    Add a flag, defaulting to false for backwards compatibility, that does
    enforce it.
    
    [1] https://tools.ietf.org/html/rfc5545#section-3.8.4.7

diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index a826cf3..b9d573a 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -52,7 +52,7 @@ methods applicable to L<Data::ICal>.
 
 =cut
 
-=head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ]
+=head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ], [ rfc_strict => $bool ]
 
 Creates a new L<Data::ICal> object. 
 
@@ -65,6 +65,13 @@ If a calname is passed, sets x-wr-calname to the given string.  Although
 not specified in RFC2445, most calendar software respects x-wr-calname
 as the displayed name of the calendar.
 
+If the C<rfc_strict> flag is set to true, will require Data::ICal to
+include UIDs, as per RFC2445:
+
+    4.8.4.7 Unique Identifier
+    ... The property MUST be specified in the "VEVENT", "VTODO",
+    "VJOURNAL" or "VFREEBUSY" calendar components"
+
 If a filename or data argument is not passed, this just sets the
 object's C<VERSION> and C<PRODID> properties to "2.0" (or "1.0" if the
 C<vcal10> flag is passed) and the value of the C<product_id> method
@@ -81,14 +88,16 @@ sub new {
     my $self  = $class->SUPER::new(@_);
 
     my %args = (
-        filename => undef,
-        calname  => undef,
-        data     => undef,
-        vcal10   => 0,
+        filename   => undef,
+        calname    => undef,
+        data       => undef,
+        vcal10     => 0,
+        rfc_strict => 0,
         @_
     );
 
     $self->vcal10( $args{vcal10} );
+    $self->rfc_strict( $args{rfc_strict} );
 
     if ( defined $args{filename} or defined $args{data} ) {
 
diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index 05277ea..ae821c9 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -145,6 +145,7 @@ sub add_entry {
     push @{ $self->{entries} }, $entry;
 
     $entry->vcal10( $self->vcal10 );
+    $entry->rfc_strict( $self->rfc_strict );
 
     return $self;
 }
@@ -418,6 +419,18 @@ same value as their parents.
 
 __PACKAGE__->mk_accessors('vcal10');
 
+=head2 rfc_strict [$bool]
+
+Gets or sets a boolean saying whether this entry will complain about
+missing UIDs as per RFC2446. Defaults to false, for backwards
+compatibility.  Generally, you can just set this on your main
+L<Data::ICal> object when you construct it; C<add_entry> automatically
+makes sure that sub-entries end up with the same value as their parents.
+
+=cut
+
+__PACKAGE__->mk_accessors('rfc_strict');
+
 =head2 header
 
 Returns the header line for the entry (including trailing newline).
diff --git a/lib/Data/ICal/Entry/Event.pm b/lib/Data/ICal/Entry/Event.pm
index 08a1646..7d56e60 100644
--- a/lib/Data/ICal/Entry/Event.pm
+++ b/lib/Data/ICal/Entry/Event.pm
@@ -42,6 +42,18 @@ Returns C<VEVENT>, its iCalendar entry name.
 
 sub ical_entry_type {'VEVENT'}
 
+=head2 mandatory_unique_properties
+
+The C<uid> property is mandatory if C<rfc_strict> was passed to
+L<Data::ICal/new>.
+
+=cut
+
+sub mandatory_unique_properties {
+    my $self = shift;
+    return $self->rfc_strict ? ("uid") : ()
+}
+
 =head2 optional_unique_properties
 
 According to the iCalendar standard, the following properties may be
@@ -67,23 +79,25 @@ Or if C<< vcal10 => 1 >>:
 
 sub optional_unique_properties {
     my $self = shift;
+    my @ret = $self->rfc_strict ? () : ("uid");
     if (not $self->vcal10) {
-        qw(
+        push @ret, qw(
             class  created  description  dtstart  geo
             last-modified  location  organizer  priority
             dtstamp  sequence  status  summary  transp
-            uid  url  recurrence-id
+            url  recurrence-id
 
             dtend duration
         );
     } else {
-        qw(
+        push @ret, qw(
             class dcreated completed description dtstart dtend
             last-modified location rnum priority
             sequence status summary transp
-            url uid
+            url
         );
     }
+    return @ret;
 }
 
 =head2 optional_repeatable_properties
diff --git a/lib/Data/ICal/Entry/FreeBusy.pm b/lib/Data/ICal/Entry/FreeBusy.pm
index 6c8a8b7..e9c4241 100644
--- a/lib/Data/ICal/Entry/FreeBusy.pm
+++ b/lib/Data/ICal/Entry/FreeBusy.pm
@@ -40,6 +40,18 @@ Returns C<VFREEBUSY>, its iCalendar entry name.
 
 sub ical_entry_type {'VFREEBUSY'}
 
+=head2 mandatory_unique_properties
+
+The C<uid> property is mandatory if C<rfc_strict> was passed to
+L<Data::ICal/new>.
+
+=cut
+
+sub mandatory_unique_properties {
+    my $self = shift;
+    return $self->rfc_strict ? ("uid") : ()
+}
+
 =head2 optional_unique_properties
 
 According to the iCalendar standard, the following properties may be
@@ -51,10 +63,13 @@ specified at most one time for a free/busy entry:
 =cut
 
 sub optional_unique_properties {
-    qw(
+    my $self = shift;
+    my @ret = qw(
         contact  dtstart  dtend  duration  dtstamp
-        organizer  uid  url
+        organizer  url
     );
+    push @ret, "uid" unless $self->rfc_strict;
+    return @ret;
 }
 
 =head2 optional_repeatable_properties
diff --git a/lib/Data/ICal/Entry/Journal.pm b/lib/Data/ICal/Entry/Journal.pm
index 2154950..3f5ae29 100644
--- a/lib/Data/ICal/Entry/Journal.pm
+++ b/lib/Data/ICal/Entry/Journal.pm
@@ -40,6 +40,18 @@ Returns C<VJOURNAL>, its iCalendar entry name.
 
 sub ical_entry_type {'VJOURNAL'}
 
+=head2 mandatory_unique_properties
+
+The C<uid> property is mandatory if C<rfc_strict> was passed to
+L<Data::ICal/new>.
+
+=cut
+
+sub mandatory_unique_properties {
+    my $self = shift;
+    return $self->rfc_strict ? ("uid") : ()
+}
+
 =head2 optional_unique_properties
 
 According to the iCalendar standard, the following properties may be
@@ -52,11 +64,14 @@ specified at most one time for a journal entry:
 =cut
 
 sub optional_unique_properties {
-    qw(
+    my $self = shift;
+    my @ret = qw(
         class  created  description  dtstart  dtstamp
         last-modified  organizer  recurrence-id  sequence  status
-        summary  uid  url
+        summary url
     );
+    push @ret, "uid" unless $self->rfc_strict;
+    return @ret;
 }
 
 =head2 optional_repeatable_properties
diff --git a/lib/Data/ICal/Entry/Todo.pm b/lib/Data/ICal/Entry/Todo.pm
index b1e0eb6..327b3ed 100644
--- a/lib/Data/ICal/Entry/Todo.pm
+++ b/lib/Data/ICal/Entry/Todo.pm
@@ -42,6 +42,18 @@ Returns C<VTODO>, its iCalendar entry name.
 
 sub ical_entry_type {'VTODO'}
 
+=head2 mandatory_unique_properties
+
+The C<uid> property is mandatory if C<rfc_strict> was passed to
+L<Data::ICal/new>.
+
+=cut
+
+sub mandatory_unique_properties {
+    my $self = shift;
+    return $self->rfc_strict ? ("uid") : ()
+}
+
 =head2 optional_unique_properties
 
 According to the iCalendar standard, the following properties may be
@@ -67,8 +79,9 @@ Or if C<< vcal10 => 1 >>:
 
 sub optional_unique_properties {
     my $self = shift;
+    my @ret = $self->rfc_strict ? () : ("uid");
     if (not $self->vcal10) {
-        qw(
+        push @ret, qw(
             class  completed  created  description  dtstamp
             dtstart  geo  last-modified  location  organizer
             percent-complete  priority  recurrence-id  sequence  status
@@ -77,13 +90,14 @@ sub optional_unique_properties {
             due duration
         );
     } else {
-        qw(
+        push @ret, qw(
             class dcreated completed description dtstart due
             last-modified location rnum priority
             sequence status summary transp
             url uid
         );
     }
+    return @ret;
 }
 
 =head2 optional_repeatable_properties

commit 81ad6df3ef3c96d2fe6cbd5a53f6a56de0d0d189
Author: Nathan Bailey <nathan.bailey at monash.edu>
Date:   Tue Feb 17 01:55:28 2015 -0500

    Provide a mechanism to auto-generate UIDs for types that require them

diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index b9d573a..aff5529 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -52,7 +52,7 @@ methods applicable to L<Data::ICal>.
 
 =cut
 
-=head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ], [ rfc_strict => $bool ]
+=head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ], [ rfc_strict => $bool ], [ auto_uid => $bool ]
 
 Creates a new L<Data::ICal> object. 
 
@@ -72,6 +72,11 @@ include UIDs, as per RFC2445:
     ... The property MUST be specified in the "VEVENT", "VTODO",
     "VJOURNAL" or "VFREEBUSY" calendar components"
 
+If the C<auto_uid> flag is set to true, will automatically generate a
+default UID for each type which requires it, based on the RFC-suggested
+algorithm.  Explicitly-set UID attributes will override this
+auto-generated value.
+
 If a filename or data argument is not passed, this just sets the
 object's C<VERSION> and C<PRODID> properties to "2.0" (or "1.0" if the
 C<vcal10> flag is passed) and the value of the C<product_id> method
@@ -93,11 +98,13 @@ sub new {
         data       => undef,
         vcal10     => 0,
         rfc_strict => 0,
+        auto_uid   => 0,
         @_
     );
 
     $self->vcal10( $args{vcal10} );
     $self->rfc_strict( $args{rfc_strict} );
+    $self->auto_uid( $args{auto_uid} );
 
     if ( defined $args{filename} or defined $args{data} ) {
 
diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index ae821c9..dc26c44 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -4,6 +4,7 @@ use strict;
 package Data::ICal::Entry;
 use base qw/Class::Accessor/;
 use Data::ICal::Property;
+use Sys::Hostname qw();         # For unique UIDs for entries
 use Carp;
 
 use constant CRLF => "\x0d\x0a";
@@ -86,6 +87,7 @@ versions of this module before 0.16.
 
 =cut
 
+my $uid = 0;
 sub as_string {
     my $self = shift;
     my %args = (
@@ -94,11 +96,22 @@ sub as_string {
     );
     my $output = $self->header(%args);
 
-    for my $name (
+    my @mandatory = (
         $self->mandatory_unique_properties,
-        $self->mandatory_repeatable_properties
-        )
-    {
+        $self->mandatory_repeatable_properties,
+    );
+
+    if (grep {$_ eq "uid"} @mandatory and !defined $self->properties->{uid}
+            and $self->auto_uid) {
+      # Per the RFC, create a "persistent, globally unique" UID for this
+      # event; "persistent" in this context does not mean consistent
+      # across time, but rather "unique across all time"
+      $self->add_property(
+          uid => time() . '-' .$$ . '-' . $uid++ . '@' . Sys::Hostname::hostname()
+      );
+    }
+
+    for my $name ( @mandatory ) {
         carp "Mandatory property for " . ( ref $self ) . " missing: $name"
             unless $self->properties->{$name}
                 and @{ $self->properties->{$name} };
@@ -146,6 +159,7 @@ sub add_entry {
 
     $entry->vcal10( $self->vcal10 );
     $entry->rfc_strict( $self->rfc_strict );
+    $entry->auto_uid( $self->auto_uid );
 
     return $self;
 }
@@ -431,6 +445,18 @@ makes sure that sub-entries end up with the same value as their parents.
 
 __PACKAGE__->mk_accessors('rfc_strict');
 
+=head2 auto_uid [$bool]
+
+Gets or sets a boolean saying whether this entry should automatically
+generate its own persistently unique UIDs.  Defaults to false.
+Generally, you can just set this on your main L<Data::ICal> object when
+you construct it; C<add_entry> automatically makes sure that sub-entries
+end up with the same value as their parents.
+
+=cut
+
+__PACKAGE__->mk_accessors('auto_uid');
+
 =head2 header
 
 Returns the header line for the entry (including trailing newline).

commit d31a5bd315bdc5c6b6504f7bceff7598f661ff10
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:03:11 2015 -0500

    Split 'require' logic into two lines appease taint mode
    
    Taint mode fails to correctly propate the flag if the hash lookup and
    concatenation are done at the same time; this leaves $alarm_class
    tainted, and the require fails if running under -T.
    
    Split the statement in twain to satisfy taint mode's analysis.

diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index dc26c44..e2f96d3 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -563,7 +563,8 @@ sub _parse_valarm {
     die "Can't parse VALARM with action $action"
         unless exists $_action_map{$action};
 
-    my $alarm_class = "Data::ICal::Entry::Alarm::" . $_action_map{$action};
+    $action = $_action_map{$action};
+    my $alarm_class = "Data::ICal::Entry::Alarm::$action";
     eval "require $alarm_class";
     die "Failed to require $alarm_class : $@" if $@;
 

commit a357b3e1ff989586c7b78d3279262480e985e4ab
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:11:15 2015 -0500

    Update footers

diff --git a/META.yml b/META.yml
index 9d80820..95b1bb1 100644
--- a/META.yml
+++ b/META.yml
@@ -1,7 +1,7 @@
 ---
 abstract: 'Generates iCalendar (RFC 2445) calendar files'
 author:
-  - 'Jesse Vincent <jesse at bestpractical.com>'
+  - 'Best Practical Solutions, LLC <modules at bestpractical.com>'
 build_requires:
   ExtUtils::MakeMaker: 6.36
   Test::LongString: 0
diff --git a/Makefile.PL b/Makefile.PL
index 238bdf0..c3d895e 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -1,7 +1,7 @@
 use inc::Module::Install;
 
 name ('Data-ICal');
-author ('Jesse Vincent <jesse at bestpractical.com>');
+author_from  ('lib/Data/ICal.pm');
 version_from ('lib/Data/ICal.pm');
 abstract_from('lib/Data/ICal.pm');
 license('perl');
diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index aff5529..0acd167 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -317,40 +317,15 @@ L<http://rt.cpan.org>.
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index e2f96d3..e9cd92d 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -626,40 +626,15 @@ sub _parse_generic_event {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm.pm b/lib/Data/ICal/Entry/Alarm.pm
index 1fbf38b..95ad030 100644
--- a/lib/Data/ICal/Entry/Alarm.pm
+++ b/lib/Data/ICal/Entry/Alarm.pm
@@ -87,40 +87,15 @@ sub mandatory_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/Audio.pm b/lib/Data/ICal/Entry/Alarm/Audio.pm
index c7f5029..d9f776a 100644
--- a/lib/Data/ICal/Entry/Alarm/Audio.pm
+++ b/lib/Data/ICal/Entry/Alarm/Audio.pm
@@ -62,40 +62,15 @@ sub optional_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/Display.pm b/lib/Data/ICal/Entry/Alarm/Display.pm
index cf15cc8..802aa70 100644
--- a/lib/Data/ICal/Entry/Alarm/Display.pm
+++ b/lib/Data/ICal/Entry/Alarm/Display.pm
@@ -63,40 +63,15 @@ sub mandatory_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/Email.pm b/lib/Data/ICal/Entry/Alarm/Email.pm
index 550e080..22b3642 100644
--- a/lib/Data/ICal/Entry/Alarm/Email.pm
+++ b/lib/Data/ICal/Entry/Alarm/Email.pm
@@ -92,40 +92,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/None.pm b/lib/Data/ICal/Entry/Alarm/None.pm
index 58af724..e4ddb5d 100644
--- a/lib/Data/ICal/Entry/Alarm/None.pm
+++ b/lib/Data/ICal/Entry/Alarm/None.pm
@@ -49,40 +49,15 @@ sub new {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/Procedure.pm b/lib/Data/ICal/Entry/Alarm/Procedure.pm
index 0403313..b7cb4c2 100644
--- a/lib/Data/ICal/Entry/Alarm/Procedure.pm
+++ b/lib/Data/ICal/Entry/Alarm/Procedure.pm
@@ -78,40 +78,15 @@ sub mandatory_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Alarm/URI.pm b/lib/Data/ICal/Entry/Alarm/URI.pm
index e9101f5..06f1921 100644
--- a/lib/Data/ICal/Entry/Alarm/URI.pm
+++ b/lib/Data/ICal/Entry/Alarm/URI.pm
@@ -69,40 +69,15 @@ sub mandatory_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Event.pm b/lib/Data/ICal/Entry/Event.pm
index 7d56e60..13aa612 100644
--- a/lib/Data/ICal/Entry/Event.pm
+++ b/lib/Data/ICal/Entry/Event.pm
@@ -149,40 +149,15 @@ defines.
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/FreeBusy.pm b/lib/Data/ICal/Entry/FreeBusy.pm
index e9c4241..a21b905 100644
--- a/lib/Data/ICal/Entry/FreeBusy.pm
+++ b/lib/Data/ICal/Entry/FreeBusy.pm
@@ -89,40 +89,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Journal.pm b/lib/Data/ICal/Entry/Journal.pm
index 3f5ae29..9355a6b 100644
--- a/lib/Data/ICal/Entry/Journal.pm
+++ b/lib/Data/ICal/Entry/Journal.pm
@@ -95,40 +95,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/TimeZone.pm b/lib/Data/ICal/Entry/TimeZone.pm
index 54a1849..4799547 100644
--- a/lib/Data/ICal/Entry/TimeZone.pm
+++ b/lib/Data/ICal/Entry/TimeZone.pm
@@ -75,40 +75,15 @@ sub mandatory_unique_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/TimeZone/Daylight.pm b/lib/Data/ICal/Entry/TimeZone/Daylight.pm
index ae89566..2b611eb 100644
--- a/lib/Data/ICal/Entry/TimeZone/Daylight.pm
+++ b/lib/Data/ICal/Entry/TimeZone/Daylight.pm
@@ -102,40 +102,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/TimeZone/Standard.pm b/lib/Data/ICal/Entry/TimeZone/Standard.pm
index 2206719..2234c22 100644
--- a/lib/Data/ICal/Entry/TimeZone/Standard.pm
+++ b/lib/Data/ICal/Entry/TimeZone/Standard.pm
@@ -102,40 +102,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Entry/Todo.pm b/lib/Data/ICal/Entry/Todo.pm
index 327b3ed..db8df09 100644
--- a/lib/Data/ICal/Entry/Todo.pm
+++ b/lib/Data/ICal/Entry/Todo.pm
@@ -136,40 +136,15 @@ sub optional_repeatable_properties {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;
diff --git a/lib/Data/ICal/Property.pm b/lib/Data/ICal/Property.pm
index bf52805..1617927 100644
--- a/lib/Data/ICal/Property.pm
+++ b/lib/Data/ICal/Property.pm
@@ -342,40 +342,15 @@ sub _fold {
 
 =head1 AUTHOR
 
-Jesse Vincent C<< <jesse at bestpractical.com> >> with David Glasser,
-Simon Wistow, and Alex Vandiver
+Best Practical Solutions, LLC E<lt>modules at bestpractical.comE<gt>
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2005 - 2009, Best Practical Solutions, LLC.  All rights reserved.
+Copyright (c) 2005 - 2015, Best Practical Solutions, LLC.  All rights reserved.
 
 This module is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself. See L<perlartistic>.
 
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
 =cut
 
 1;

commit bedf2a48656087c67383b77c12042528c15040dd
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:12:31 2015 -0500

    Whitespace cleanups

diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index 0acd167..1791d7f 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -54,7 +54,7 @@ methods applicable to L<Data::ICal>.
 
 =head2 new [ data => $data, ] [ filename => $file ], [ calname => $string ], [ vcal10 => $bool ], [ rfc_strict => $bool ], [ auto_uid => $bool ]
 
-Creates a new L<Data::ICal> object. 
+Creates a new L<Data::ICal> object.
 
 If it is given a filename or data argument is passed, then this parses the
 content of the file or string into the object.  If the C<vcal10> flag is passed,
@@ -83,7 +83,7 @@ C<vcal10> flag is passed) and the value of the C<product_id> method
 respectively.
 
 Returns a false value upon failure to open or parse the file or data; this false
-value is a L<Class::ReturnValue> object and can be queried as to its 
+value is a L<Class::ReturnValue> object and can be queried as to its
 C<error_message>.
 
 =cut
diff --git a/lib/Data/ICal/Entry.pm b/lib/Data/ICal/Entry.pm
index e9cd92d..11b8e7e 100644
--- a/lib/Data/ICal/Entry.pm
+++ b/lib/Data/ICal/Entry.pm
@@ -23,8 +23,8 @@ Data::ICal::Entry - Represents an entry in an iCalendar file
 
     $calendar->add_entry($vtodo);
 
-    $event->add_entry($alarm); 
-    $event->add_entries($alarm1, ...); 
+    $event->add_entry($alarm);
+    $event->add_entries($alarm1, ...);
 
     # or all in one go
     my $vtodo = Data::ICal::Entry::Todo->new( \%props, \@entries );
@@ -63,8 +63,8 @@ sub new {
     $self->set( properties => {} );
     $self->set( entries    => [] );
     for (@_) {
-	ref $_ eq "HASH"  and $self->add_properties( %$_ );
-	ref $_ eq "ARRAY" and $self->add_entries( @$_ );
+        ref $_ eq "HASH"  and $self->add_properties( %$_ );
+        ref $_ eq "ARRAY" and $self->add_entries( @$_ );
     }
     return $self;
 }
@@ -291,7 +291,7 @@ sub add_properties {
     return $self;
 }
 
-=head2 mandatory_unique_properties 
+=head2 mandatory_unique_properties
 
 Subclasses should override this method (which returns an empty list by
 default) to provide a list of lower case strings identifying the
@@ -302,7 +302,7 @@ type.
 
 sub mandatory_unique_properties { () }
 
-=head2 mandatory_repeatable_properties 
+=head2 mandatory_repeatable_properties
 
 Subclasses should override this method (which returns an empty list by
 default) to provide a list of lower case strings identifying the
@@ -313,7 +313,7 @@ type.
 
 sub mandatory_repeatable_properties { () }
 
-=head2 optional_unique_properties 
+=head2 optional_unique_properties
 
 Subclasses should override this method (which returns an empty list by
 default) to provide a list of lower case strings identifying the
@@ -503,7 +503,7 @@ my %_generic = (
 Translate a L<Text::vFile::asData> sub object into the appropriate
 L<Data::iCal::Event> subtype.
 
-=cut 
+=cut
 
 # TODO: this is currently recursive which could blow the stack -
 #       it might be worth refactoring to make it sequential
diff --git a/lib/Data/ICal/Entry/Alarm/Audio.pm b/lib/Data/ICal/Entry/Alarm/Audio.pm
index d9f776a..2deaf72 100644
--- a/lib/Data/ICal/Entry/Alarm/Audio.pm
+++ b/lib/Data/ICal/Entry/Alarm/Audio.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::Alarm::Audio - Represents an audio alarm in an iCalendar file
     my $valarm = Data::ICal::Entry::Alarm::Audio->new();
     $valarm->add_properties(
         attach => [ "ftp://host.com/pub/sounds/bell-01.aud", { fmttype => "audio/basic" } ],
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
     );
 
diff --git a/lib/Data/ICal/Entry/Alarm/Display.pm b/lib/Data/ICal/Entry/Alarm/Display.pm
index 802aa70..baef2d3 100644
--- a/lib/Data/ICal/Entry/Alarm/Display.pm
+++ b/lib/Data/ICal/Entry/Alarm/Display.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::Alarm::Display - Represents a displayed alarm in an iCalendar
     my $valarm = Data::ICal::Entry::Alarm::Display->new();
     $valarm->add_properties(
         description => "Wake up!",
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
     );
 
diff --git a/lib/Data/ICal/Entry/Alarm/Email.pm b/lib/Data/ICal/Entry/Alarm/Email.pm
index 22b3642..fc837f8 100644
--- a/lib/Data/ICal/Entry/Alarm/Email.pm
+++ b/lib/Data/ICal/Entry/Alarm/Email.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::Alarm::Email - Represents an emailed alarm in an iCalendar fi
     my $valarm = Data::ICal::Entry::Alarm::Audio->new();
     $valarm->add_properties(
         attach => [ "basic:ftp://host.com/pub/sounds/bell-01.aud", { fmttype => "audio/basic" } ],
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
     );
 
diff --git a/lib/Data/ICal/Entry/Alarm/Procedure.pm b/lib/Data/ICal/Entry/Alarm/Procedure.pm
index b7cb4c2..1e6c767 100644
--- a/lib/Data/ICal/Entry/Alarm/Procedure.pm
+++ b/lib/Data/ICal/Entry/Alarm/Procedure.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::Alarm::Procedure - Represents a procedure-call alarm in an iC
     my $valarm = Data::ICal::Entry::Alarm::Procedure->new();
     $valarm->add_properties(
         attach => [ "ftp://host.com/novo-procs/felizano.exe", { fmttype => "application/binary" } ],
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
     );
 
diff --git a/lib/Data/ICal/Entry/Alarm/URI.pm b/lib/Data/ICal/Entry/Alarm/URI.pm
index 06f1921..660a69f 100644
--- a/lib/Data/ICal/Entry/Alarm/URI.pm
+++ b/lib/Data/ICal/Entry/Alarm/URI.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::Alarm::URI - Represents notification via a custom URI
     my $valarm = Data::ICal::Entry::Alarm::URI->new();
     $valarm->add_properties(
         uri => "sms:+15105550101?body=hello%20there",
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         trigger   => [ Date::ICal->new( epoch => ... )->ical, { value => 'DATE-TIME' } ],
     );
 
diff --git a/lib/Data/ICal/Entry/Event.pm b/lib/Data/ICal/Entry/Event.pm
index 13aa612..fa17856 100644
--- a/lib/Data/ICal/Entry/Event.pm
+++ b/lib/Data/ICal/Entry/Event.pm
@@ -15,13 +15,13 @@ Data::ICal::Entry::Event - Represents an event in an iCalendar file
     $vevent->add_properties(
         summary => "my party",
         description => "I'll cry if I want to",
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         dtstart   => Date::ICal->new( epoch => time )->ical,
     );
 
     $calendar->add_entry($vevent);
 
-    $vevent->add_entry($alarm); 
+    $vevent->add_entry($alarm);
 
 =head1 DESCRIPTION
 
@@ -59,10 +59,10 @@ sub mandatory_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified at most one time for an event:
 
-	class  created  description  dtstart  geo 
-	last-modified  location  organizer  priority 
-	dtstamp  sequence  status  summary  transp 
-	uid  url  recurrence-id 
+        class  created  description  dtstart  geo
+        last-modified  location  organizer  priority
+        dtstamp  sequence  status  summary  transp
+        uid  url  recurrence-id
 
 In addition, C<dtend> and C<duration> may be specified at most once
 each, but not both in the same entry (though this restriction is not
@@ -105,9 +105,9 @@ sub optional_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified any number of times for an event:
 
-	attach  attendee  categories  comment 
-	contact  exdate  exrule  request-status  related-to 
-	resources  rdate  rrule  
+        attach  attendee  categories  comment
+        contact  exdate  exrule  request-status  related-to
+        resources  rdate  rrule
 
 Or if C<< vcal10 => 1 >>:
 
diff --git a/lib/Data/ICal/Entry/FreeBusy.pm b/lib/Data/ICal/Entry/FreeBusy.pm
index a21b905..3655a4e 100644
--- a/lib/Data/ICal/Entry/FreeBusy.pm
+++ b/lib/Data/ICal/Entry/FreeBusy.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::FreeBusy - Represents blocks of free and busy time in an iCal
     my $vfreebusy = Data::ICal::Entry::FreeBusy->new();
     $vfreebusy->add_properties(
         organizer => 'MAILTO:jsmith at host.com',
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         freebusy   => Date::ICal->new( epoch => ... )->ical . '/' . Date::ICal->new( epoch => ... )->ical,
     );
 
@@ -57,8 +57,8 @@ sub mandatory_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified at most one time for a free/busy entry:
 
-	contact  dtstart  dtend  duration  dtstamp 
-	organizer  uid  url 
+        contact  dtstart  dtend  duration  dtstamp
+        organizer  uid  url
 
 =cut
 
diff --git a/lib/Data/ICal/Entry/Journal.pm b/lib/Data/ICal/Entry/Journal.pm
index 9355a6b..5813bce 100644
--- a/lib/Data/ICal/Entry/Journal.pm
+++ b/lib/Data/ICal/Entry/Journal.pm
@@ -15,7 +15,7 @@ Data::ICal::Entry::Journal - Represents a journal entry in an iCalendar file
     $vjournal->add_properties(
         summary => "Minutes of my party",
         description => "I cried because I wanted to.",
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         dtstart   => Date::ICal->new( epoch => time )->ical,
     );
 
@@ -57,9 +57,9 @@ sub mandatory_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified at most one time for a journal entry:
 
-    class  created  description  dtstart  dtstamp 
-    last-modified  organizer  recurrence-id  sequence  status 
-    summary  uid  url 
+    class  created  description  dtstart  dtstamp
+    last-modified  organizer  recurrence-id  sequence  status
+    summary  uid  url
 
 =cut
 
@@ -79,9 +79,9 @@ sub optional_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified any number of times for a journal entry:
 
-	attach  attendee  categories  comment 
-	contact  exdate  exrule  related-to  rdate 
-	rrule  request-status  
+        attach  attendee  categories  comment
+        contact  exdate  exrule  related-to  rdate
+        rrule  request-status
 
 =cut
 
diff --git a/lib/Data/ICal/Entry/TimeZone.pm b/lib/Data/ICal/Entry/TimeZone.pm
index 4799547..9904bbc 100644
--- a/lib/Data/ICal/Entry/TimeZone.pm
+++ b/lib/Data/ICal/Entry/TimeZone.pm
@@ -14,7 +14,7 @@ Data::ICal::Entry::TimeZone - Represents a time zone definition in an iCalendar
     my $vtimezone = Data::ICal::Entry::TimeZone->new();
     $vtimezone->add_properties(
         tzid => "US-Eastern",
-	tzurl => "http://zones.stds_r_us.net/tz/US-Eastern"
+        tzurl => "http://zones.stds_r_us.net/tz/US-Eastern"
     );
 
     $vtimezone->add_entry($daylight); # daylight/ standard not yet implemented
@@ -50,7 +50,7 @@ sub ical_entry_type {'VTIMEZONE'}
 According to the iCalendar standard, the following properties may be
 specified at most one time for a time zone declaration:
 
-	last-modified tzurl
+        last-modified tzurl
 
 =cut
 
diff --git a/lib/Data/ICal/Entry/TimeZone/Daylight.pm b/lib/Data/ICal/Entry/TimeZone/Daylight.pm
index 2b611eb..2db0b69 100644
--- a/lib/Data/ICal/Entry/TimeZone/Daylight.pm
+++ b/lib/Data/ICal/Entry/TimeZone/Daylight.pm
@@ -70,7 +70,7 @@ sub ical_entry_type {'DAYLIGHT'}
 According to the iCalendar standard, the following properties must be
 specified exactly one time in a daylight declaration:
 
-	dtstart  tzoffsetto  tzoffsetfrom
+        dtstart  tzoffsetto  tzoffsetfrom
 
 =cut
 
@@ -87,7 +87,7 @@ sub mandatory_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified any number of times for a daylight declaration:
 
-	comment  rdate  rrule  tzname  
+        comment  rdate  rrule  tzname
 
 =cut
 
diff --git a/lib/Data/ICal/Entry/TimeZone/Standard.pm b/lib/Data/ICal/Entry/TimeZone/Standard.pm
index 2234c22..72599bf 100644
--- a/lib/Data/ICal/Entry/TimeZone/Standard.pm
+++ b/lib/Data/ICal/Entry/TimeZone/Standard.pm
@@ -70,7 +70,7 @@ sub ical_entry_type {'STANDARD'}
 According to the iCalendar standard, the following properties must be
 specified exactly one time in a standard time declaration:
 
-	dtstart  tzoffsetto  tzoffsetfrom
+        dtstart  tzoffsetto  tzoffsetfrom
 
 =cut
 
@@ -87,7 +87,7 @@ sub mandatory_unique_properties {
 According to the iCalendar standard, the following properties may be
 specified any number of times for a standard time declaration:
 
-	comment  rdate  rrule  tzname 
+        comment  rdate  rrule  tzname
 
 =cut
 
diff --git a/lib/Data/ICal/Entry/Todo.pm b/lib/Data/ICal/Entry/Todo.pm
index db8df09..fb39d55 100644
--- a/lib/Data/ICal/Entry/Todo.pm
+++ b/lib/Data/ICal/Entry/Todo.pm
@@ -15,13 +15,13 @@ Data::ICal::Entry::Todo - Represents a to-do entry in an iCalendar file
     $vtodo->add_properties(
         summary   => "go to sleep",
         status    => 'INCOMPLETE',
-	# Dat*e*::ICal is not a typo here
+        # Dat*e*::ICal is not a typo here
         dtstart   => Date::ICal->new( epoch => time )->ical,
     );
 
     $calendar->add_entry($vtodo);
 
-    $vtodo->add_entry($alarm); 
+    $vtodo->add_entry($alarm);
 
 =head1 DESCRIPTION
 
@@ -107,7 +107,7 @@ specified any number of times for a to-do item:
 
       attach  attendee  categories  comment  contact
       exdate  exrule  request-status  related-to  resources
-      rdate  rrule  
+      rdate  rrule
 
 Or if C<< vcal10 => 1 >>:
 

commit 21a7c7fb4ba8ca0a4590a1e891d8c0fb6369327e
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:15:54 2015 -0500

    Tidy Changes

diff --git a/Changes b/Changes
index 9ac41b5..b1f8fee 100644
--- a/Changes
+++ b/Changes
@@ -1,105 +1,81 @@
 Revision history for Data-ICal
 
-0.21
-    * Examine properties in consistent order, so tests pass on 5.18 and
-      above
+0.21 2013-07-03
+ - Examine properties in consistent order, so tests pass on 5.18 and above
 
-0.20
-    * Properly restrict the valid properties when iCal version 1.0
-      (Ashley Willis)
+0.20 2013-05-01
+ - Properly restrict the valid properties when iCal version 1.0 (Ashley
+   Willis)
 
-0.19
-    * Always output the VERSION property first
+0.19 2012-12-03
+ - Always output the VERSION property first
 
-0.18
-    * Spelling fixes from Debian (Salvatore Bonaccorso)
+0.18 2011-12-05
+ - Spelling fixes from Debian (Salvatore Bonaccorso)
 
-0.17
-    * Allow chaining of methods (H.Merijn Brand)
-    * Allow properties and entries in constructor (H.Merijn Brand)
+0.17 2011-11-27
+ - Allow chaining of methods (H.Merijn Brand)
+ - Allow properties and entries in constructor (H.Merijn Brand)
 
-0.16
-    * Use \r\n as the newline character, per RFC 3445
-    * Escaping of \ was being done incorrectly, and tested incorrectly
-    * Remove a useless and incorrect "escape code"
-    * Mention Data::ICal::DateTime (patch from Mark Stosberg)
-    * Update copyright
-    * POD cleanup
-    * Update README from POD
-    * POD nits; mostly reflowing and whitespace fixes
-    * Perltidy
+0.16 2009-07-10
+ - Use \r\n as the newline character, per RFC 3445
+ - Escaping of \ was being done incorrectly, and tested incorrectly
+ - Remove a useless and incorrect "escape code"
+ - Mention Data::ICal::DateTime (patch from Mark Stosberg)
+ - Update copyright
+ - POD cleanup
+ - Update README from POD
+ - POD nits; mostly reflowing and whitespace fixes
+ - Perltidy
 
-0.15
-    * Escaping fixes
+0.15 2009-03-02
+ - Escaping fixes
 
-0.14
-    * No longer explodes if your .ics file lacks a VERSION property
-    * Perl 5.11 adds additional strictures. Patch from ANDK to deal [rt.cpan.org #34717] 
+0.14 2008-04-07
+ - No longer explodes if your .ics file lacks a VERSION property
+ - Perl 5.11 adds additional strictures. Patch from ANDK to deal
+   [rt.cpan.org #34717]
 
-0.13
+0.13 2007-03-14
+ - We now ignore blank lines in parsed files (by ignoring null properties
+   when adding them to a data structure)
+ - ical2html example script contributed by Tatsuhiko Miyagawa
+   <miyagawa at bulknews.net>
 
-    * We now ignore blank lines in parsed files (by ignoring null properties when adding them to a data structure)
-    * ical2html example script contributed by Tatsuhiko Miyagawa <miyagawa at bulknews.net>
+0.12 2007-01-12
+ - Better handling of properties that should read "0" - Patch from Duncan
+   Forsyth <duncan at wcn.co.uk>
+ - Removed the note about Google and weird folding behaviour
 
-0.12
+0.11 2006-11-27
+ - Added the ability to not fold the output, to appease the great
+   Google-monster
 
-    * Better handling of properties that should read "0" - Patch from Duncan Forsyth <duncan at wcn.co.uk>
-    * Removed the note about Google and weird folding behaviour
+0.10 2006-10-15
+ - Fix the test suite to stop assuming version numbers
 
+0.09 2006-10-15
+ - Quieted down ::Property when you passed in undef strings.
 
-0.11 Mon Nov 27 12:57:03 EST 2006
+0.08 2006-09-16
+ - Fix escaping within the recur type
 
-    * Added the ability to not fold the output, to appease the great Google-monster
+0.07 2006-01-24
+ - Doc patches from MARKSTOS
+ - Proper quoting in properties, from MARKSTOS
 
-0.10 Sun Oct 15 15:55:28 EDT 2006
+0.05 2005-10-06
+ - Fixed a signature file
 
-    * Fix the test suite to stop assuming version numbers
+0.04 2005-08-30
+ - Better roundtripping to .ics
 
-0.09 Sun Oct 15 15:49:29 EDT 2006
+0.03 2005-08-15
+ - Can parse strings, not just files (this is an incompatible API change)
 
-    * Quieted down ::Property when you passed in undef strings.
-
-0.08 Sat Sep 16 14:03:03 BST 2006
-
-    * The recur type is defined in section 4.3.10 in RFC2445.
-
-    This type is separated by comma or semicolon as shown in "description"
-    part of this section;
-
-    | multiple "recur" values are specified by a COMMA character (US-ASCII
-    decimal 44) separated list of values.
-
-    | The rule parts are separated from each other by the SEMICOLON
-    character (US-ASCII decimal 59).
-
-    At the middle of this section, an example is presented;
-
-    | RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
-
-    See http://www.kanzaki.com/docs/ical/recur.html
-
-        - Takeru Inoue
-
-
-0.07
-
-    * Doc patches from MARKSTOS
-    * Proper quoting in properties, from MARKSTOS
-
-0.05  Thu Oct  6 20:56:05 EDT 2005
-    * Fixed a signature file
-
-0.04  Tue Aug 30 05:30:59 EDT 2005
-    * Better roundtripping to .ics
-
-0.03  Mon Aug 15 16:05:00 EDT 2005
-    * Can parse strings, not just files (this is an incompatible API change)
-
-0.02  Wed Aug 03 11:25:00 EDT 2005
-    * Parser support, thanks to Simon Wistow
-    * Full Time Zone support
-
-0.01  Wed Jul 27 11:52:12 EDT 2005
-
-    * Initial release
+0.02 2005-08-03
+ - Parser support, thanks to Simon Wistow
+ - Full Time Zone support
 
+0.01 2005-07-27
+ - Initial release

commit 25db85e588f2567d89dca949901c183f12282346
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:24:10 2015 -0500

    Packaging updates

diff --git a/.gitignore b/.gitignore
index ebaf4d1..eac79db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
-Makefile
-blib/
-Makefile.old
-pm_to_blib
-MANIFEST.bak
+/Makefile
+/blib/
+/Makefile.old
+/pm_to_blib
+/MANIFEST.bak
+/MYMETA.*
diff --git a/MANIFEST b/MANIFEST
index d0835d0..b2dae87 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,3 +1,4 @@
+.shipit
 Changes
 doc/rfc2445.txt
 examples/ical2html.pl
@@ -14,10 +15,13 @@ inc/Module/Install/Win32.pm
 inc/Module/Install/WriteAll.pm
 lib/Data/ICal.pm
 lib/Data/ICal/Entry.pm
+lib/Data/ICal/Entry/Alarm.pm
 lib/Data/ICal/Entry/Alarm/Audio.pm
 lib/Data/ICal/Entry/Alarm/Display.pm
 lib/Data/ICal/Entry/Alarm/Email.pm
+lib/Data/ICal/Entry/Alarm/None.pm
 lib/Data/ICal/Entry/Alarm/Procedure.pm
+lib/Data/ICal/Entry/Alarm/URI.pm
 lib/Data/ICal/Entry/Event.pm
 lib/Data/ICal/Entry/FreeBusy.pm
 lib/Data/ICal/Entry/Journal.pm
diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP
deleted file mode 100644
index d9eb078..0000000
--- a/MANIFEST.SKIP
+++ /dev/null
@@ -1,19 +0,0 @@
-\bRCS\b
-\bCVS\b
-,v$
-\B\.svn\b
-^MANIFEST\.
-^Makefile$
-^blib/
-^MakeMaker-\d
-~$
-\.old$
-^#.*#$
-^\.#
-\bcover_db\b
-\.swp$
-\.swo$
-pm_to_blib
-\.shipit$
-^.git/
-.gitignore

commit f8df6b71dbef08a10db76c085bd9ae90ce6730a9
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Tue Feb 17 02:24:25 2015 -0500

    Checking in changes prior to tagging of version 0.22.
    
    Changelog diff is:
    
    diff --git a/Changes b/Changes
    index b1f8fee..7813dd9 100644
    --- a/Changes
    +++ b/Changes
    @@ -1,5 +1,13 @@
     Revision history for Data-ICal
    
    +0.22 2015-02-17
    + - Add URI and NONE alarm types, for compatibility with Apple iCal
    + - Add support for the common X-WR-CalName property
    + - Optionally enforce UID attribute
    + - Optionally auto-generate UID
    + - Run with taint mode enabled
    + - Packaging updates
    +
     0.21 2013-07-03
      - Examine properties in consistent order, so tests pass on 5.18 and above

diff --git a/Changes b/Changes
index b1f8fee..7813dd9 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,13 @@
 Revision history for Data-ICal
 
+0.22 2015-02-17
+ - Add URI and NONE alarm types, for compatibility with Apple iCal
+ - Add support for the common X-WR-CalName property
+ - Optionally enforce UID attribute
+ - Optionally auto-generate UID
+ - Run with taint mode enabled
+ - Packaging updates
+
 0.21 2013-07-03
  - Examine properties in consistent order, so tests pass on 5.18 and above
 
diff --git a/META.yml b/META.yml
index 95b1bb1..cee50b6 100644
--- a/META.yml
+++ b/META.yml
@@ -30,4 +30,4 @@ requires:
   Text::vFile::asData: 0
 resources:
   license: http://dev.perl.org/licenses/
-version: '0.21'
+version: '0.22'
diff --git a/lib/Data/ICal.pm b/lib/Data/ICal.pm
index 1791d7f..1445688 100644
--- a/lib/Data/ICal.pm
+++ b/lib/Data/ICal.pm
@@ -7,7 +7,7 @@ use base qw/Data::ICal::Entry/;
 use Class::ReturnValue;
 use Text::vFile::asData;
 
-our $VERSION = '0.21';
+our $VERSION = '0.22';
 
 use Carp;
 

-----------------------------------------------------------------------


More information about the Bps-public-commit mailing list