CHI-Cascade

 view release on metacpan or  search on metacpan

lib/CHI/Cascade/Rule.pm  view on Meta::CPAN

package CHI::Cascade::Rule;

use strict;
use warnings;
use v5.10;

use Scalar::Util 'weaken';

sub new {
    my ($class, %opts) = @_;

    my $from = ref($class) ? $class : \%opts;

    $opts{depends} = [ defined( $opts{depends} ) ? ( $opts{depends} ) : () ]
      unless ref( $opts{depends} );

    # To do clone or new object
    my $self = bless {
        map( { $_ => $from->{$_} }
          grep { exists $from->{$_} }
          qw( target depends depends_catch code params busy_lock cascade recomputed actual_term ttl value_expires ) ),
        qr_params       => [],
        matched_target  => undef
    }, ref($class) || $class;

    if ( $opts{run_instance} ) {
        $self->{run_instance} = $opts{run_instance};
        weaken $self->{run_instance};   # It is against memory leaks
    }

    weaken $self->{cascade};            # It is against memory leaks
    $self->{resolved_depends} = undef;

    $self;
}

sub qr_params {
    my $self = shift;

    if (@_) {
        $self->{qr_params} = [ @_ ];
    }
    else {
        return @{ $self->{qr_params} };
    }
}

sub depends {
    my $self = shift;

    return $self->{resolved_depends}
      if $self->{resolved_depends};

    if ( ref( $self->{depends} ) eq 'CODE' ) {
        my $res = $self->{depends}->( $self, $self->qr_params );

        $self->{resolved_depends} = ref($res) eq 'ARRAY' ? [ @$res ] : [ $res ];
    }
    else {
        $self->{resolved_depends} = [ @{ $self->{depends} } ];
    }

    for ( @{ $self->{resolved_depends} } ) {
        $_ = $_->( $self, $self->qr_params )
          if ( ref eq 'CODE' );
    }

    $self->{resolved_depends};
}

sub value_expires {
    my $self = shift;

    if (@_) {
        $self->{value_expires} = $_[0];
        return $self;
    }
    ( ref $self->{value_expires} eq 'CODE' ? $self->{value_expires}->( $self ) : $self->{value_expires} ) // 'never';
}

sub target_expires {
    my ( $self, $trg_obj ) = @_;

    $trg_obj->locked
        ?
        $self->{busy_lock} || $self->{cascade}{busy_lock} || 'never'
        :
        $trg_obj->expires // $trg_obj->expires( $self->value_expires );
}

sub ttl {



( run in 1.746 second using v1.01-cache-2.11-cpan-97f6503c9c8 )