App-KGB
view release on metacpan or search on metacpan
lib/App/KGB/Change.pm view on Meta::CPAN
=over
=item B<action> (B<mandatory>)
The action performed on the item. Possible values are:
=over
=item B<M>
The path was modified.
=item B<A>
The path was added.
=item B<D>
The path was deleted.
=item B<R>
The path was replaced.
=back
=item path (B<mandatory>)
The path that was changed.
=item prop_change
Boolean. Indicated that some properties of the path, not the content were
changed.
=back
=cut
use base 'Class::Accessor::Fast';
__PACKAGE__->mk_accessors(qw( action prop_change path ));
use Carp qw(confess);
=head1 CONSTRUCTOR
=head2 new ( { I<initial values> } )
More-or-less standard constructor.
It can take a hashref with keys all the field names (See L<|FIELDS>).
Or, it can take a single string, which is de-composed into components.
See L<|SYNOPSIS> for examples.
=cut
sub new {
my $class = shift;
my $self = $class->SUPER::new();
my $h = shift;
if ( ref($h) ) {
defined( $self->action( delete $h->{action} ) )
or confess "'action' is required";
defined( $self->path( delete $h->{path} ) )
or confess "'path' is required";
$self->prop_change( delete $h->{prop_change} );
}
else {
my ( $a, $pc, $p ) = $h =~ /^(?:\(([MADR])?(\+)?\))?(.+)$/
or confess "'$h' is not recognized as a change string";
$self->action( $a //= 'M' );
$self->prop_change( defined $pc );
$self->path($p);
}
return $self;
}
=head1 METHODS
=over
=item as_string()
Return a string representation of the change. Used by the "" overload. The resulting string is suitable for feeding the L<|new> constructor if needed.
=cut
use overload '""' => \&as_string;
sub as_string {
my $c = shift;
my $a = $c->action;
my $pc = $c->prop_change ? '+' : '';
my $p = $c->path;
my $text = '';
# ignore flags for modifications (unless there is also a property change)
$text = "($a$pc)" if $a ne 'M' or $pc;
$p =~ s,^/,,; # strip leading slash from paths
$text .= $p;
return $text;
}
=back
=head1 CLASS METHODS
=over
=item detect_common_dir(C<changes>)
Given an arrayref of changes (instances of APP::KGB::Change), detects the
longest path that is common to all of them. All the changes' paths are trimmed
from the common part.
Example:
( run in 1.148 second using v1.01-cache-2.11-cpan-364913b4093 )