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 )