aboutsummaryrefslogblamecommitdiffstats
path: root/changed_update.pl
blob: 2e6b733ba323f7baa082b254bf70418b0f36fc41 (plain) (tree)






















































































































                                                                                     
#!/usr/bin/env perl

use strict;
use warnings;

use feature qw/say/;
use DateTime;

my $infile = $ARGV[0] // 'feature-tests/template.pl.copy';

my $transform = PPI::Transform::UpdateTimestamp->new
  (
   updated => DateTime->now,
   quiet   => 1
  );


my $ret = $transform->file($infile);

say "Return value: " . defined $ret && $ret ? 'success' : 'failure';


package PPI::Transform::UpdateTimestamp;

use strict;
use warnings;

use PPI;
use PPI::Dumper;
use DateTime;

use base 'PPI::Transform';

our	$VERSION = '3.14';

use feature qw/say/;

sub new {
    my ($class, @args) = @_;
	my $self = $class->SUPER::new(@args);

	# Must provide an updated timestamp.
	unless ( exists ($self->{updated}) ) {
		#PPI::Exception->throw("Did not provide a valid updated timestamp.");
        my $now = DateTime->now();
        carp "No updated value provided, using $now";
        $self->set_updated($now);
	}

    return $self;
}

sub updated {
    $_[0]->{updated};
}
sub quiet {
    $_[0]->{quiet}
}

sub set_updated {
    my ($self, $val) = shift;
    $self->{updatd} = $val;
}

sub document {
    my ($self, $doc) = @_;
    die "Transform requires PPI::Document" unless ref($doc) eq 'PPI::Document';

    my $vars = $doc->find('PPI::Statement::Variable');
    my $ret = 0;
    foreach my $var (@$vars) {
        foreach my $vc ($var->children) {
            if ($vc->class eq 'PPI::Token::Symbol' and
                $vc->canonical eq '%IRSSI') {
                say "Found IRSSI Hash, processing it" unless $self->quiet;
                $ret = $self->examine_struct($vc->statement);
            }
        }
    }
    return $ret;
}

sub examine_struct {
    my ($self, $stmt) = @_;
    my $ret = 0;

    unless ($self->quiet) {
        my $dumper = PPI::Dumper->new($stmt);
        $dumper->print();
        say "-" x 60;
    }

    foreach my $node ($stmt->schildren) {

        if ($node->class eq 'PPI::Structure::List') {

            foreach my $t ($node->tokens) {
                next unless $t->significant;
                if ($t->class eq 'PPI::Token::Word' and
                    $t->content =~ m/updated/) {

                    my $val = $t->snext_sibling->snext_sibling;
                    $val->set_content($self->updated);

                    if ($val->content eq $self->updated) {
                        $ret = 1;
                    }
                    
                    say "Thingie: " . $t->content unless $self->quiet;
                    say "value set to: " . $val->content unless $self->quiet;
                }
            }
        }
    }
    return $ret;
}

1;