Schedule-Activity
view release on metacpan or search on metacpan
lib/Schedule/Activity/Node.pm view on Meta::CPAN
package Schedule::Activity::Node;
use strict;
use warnings;
use List::Util qw/any/;
use Ref::Util qw/is_arrayref is_hashref is_ref/;
use Scalar::Util qw/blessed looks_like_number/;
our $VERSION='0.3.0';
my %property=map {$_=>undef} qw/tmmin tmavg tmmax next finish message attribute note attributes require/;
my %defaults=(
'tmmax/tmavg'=>5/4,
'tmavg/tmmin'=>4/3,
'tmmax/tmmin'=>5/3,
);
sub new {
my ($ref,%opt)=@_;
my $class=is_ref($ref)||$ref;
return bless(\%opt,$class);
}
sub defaulting {
my ($node)=@_;
my $mult=sub { my ($x,$y)=@_; if(defined($y)) { return $x*$y } return };
my @lln;
foreach my $k (qw/tmmin tmavg tmmax/) {
if(looks_like_number($$node{$k})) { push @lln,1 }
else { delete($$node{$k}); push @lln,0 }
}
if(any {!$_} @lln) {
if($lln[1]) {
$$node{tmmax}//=$$node{tmavg}*$defaults{'tmmax/tmavg'};
$$node{tmmin}//=$$node{tmavg}/$defaults{'tmavg/tmmin'};
}
elsif($lln[0]) {
if($lln[2]) { $$node{tmavg}=0.5*($$node{tmmin}+$$node{tmmax}) }
else {
$$node{tmmax}//=$$node{tmmin}*$defaults{'tmmax/tmmin'};
$$node{tmavg}//=$$node{tmmin}*$defaults{'tmavg/tmmin'};
}
}
elsif($lln[2]) {
$$node{tmavg}//=$$node{tmmax}/$defaults{'tmmax/tmavg'};
$$node{tmmin}//=$$node{tmmax}/$defaults{'tmmax/tmmin'};
}
}
return;
}
sub nextnames {
my ($self,$filtered,$node)=@_;
if(!defined($node)) { $node=$$self{next}; $filtered=1 }
if(is_arrayref($node)) {
my @res;
foreach my $next (@$node) {
if(!$filtered) { push @res,$next }
elsif(defined($next)&&!is_ref($next)) { push @res,$next }
elsif(is_hashref($next)&&$$next{keyname}) { push @res,$$next{keyname} }
}
return @res;
}
elsif(is_hashref($node)) { return keys %$node }
elsif(!defined($node)) { return }
( run in 0.548 second using v1.01-cache-2.11-cpan-39bf76dae61 )