Schedule-Activity

 view release on metacpan or  search on metacpan

lib/Schedule/Activity/Attributes.pm  view on Meta::CPAN

package Schedule::Activity::Attributes;

use strict;
use warnings;
use Ref::Util qw/is_ref/;
use Schedule::Activity::Attribute;

our $VERSION='0.3.0';

sub new {
	my ($ref,%opt)=@_;
	my $class=is_ref($ref)||$ref;
	my %self=(
		attr =>{},
		stack=>[],
	);
	return bless(\%self,$class);
}

sub register {
	my ($self,$attribute,%opt)=@_;
	my @errors;
	if(defined($$self{attr}{$attribute})) {
		if($opt{type}&&($$self{attr}{$attribute}{type} ne $opt{type})) {
			push @errors,"Attribute conflicting types:  $attribute" }
		return @errors;
	}
	eval {
		$$self{attr}{$attribute}=Schedule::Activity::Attribute->new(%opt);
		push @errors,$$self{attr}{$attribute}->validateConfig(%opt);
	};
	if($@) { push @errors,$@ }
	return @errors;
}

# sub get { my ($self,$attribute)=@_; ... } # not yet needed

sub log {
	my ($self,$tm)=@_;
	if(!defined($tm)) { return $self }
	foreach my $A (values %{$$self{attr}}) { $A->change(tm=>$tm,_log=>1) }
	return $self;
}

sub change {
	my ($self,$attribute,%opt)=@_;
	my $A=$$self{attr}{$attribute};
	if(!$A) { return }
	$A->change(%opt);
	return $self;
}

sub report {
	my ($self)=@_;
	my %res;
	while(my ($k,$v)=each %{$$self{attr}}) { %{$res{$k}}=$v->report() }
	return %res;
}

sub reset {
	my ($self)=@_;
	foreach my $attr (values %{$$self{attr}}) { $attr->reset() }
	return $self;
}



( run in 1.913 second using v1.01-cache-2.11-cpan-39bf76dae61 )