Schedule-Activity

 view release on metacpan or  search on metacpan

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

package Schedule::Activity::Message;

use strict;
use warnings;
use Ref::Util qw/is_arrayref is_hashref is_ref/;

our $VERSION='0.3.0';

my %property=map {$_=>undef} qw/message attributes names note/;

sub new {
	my ($ref,%opt)=@_;
	my $class=is_ref($ref)||$ref;
	my %self=(
		attributes=>$opt{attributes}//{},
		msg       =>[],
		names     =>$opt{names}//{},
	);
	if(is_hashref($opt{message})) {
		if(is_arrayref($opt{message}{alternates})) {
			@{$self{msg}}=grep
				{is_hashref($_) && (
						 (!is_ref($$_{message}) && defined($$_{message}))
					|| (!is_ref($$_{name})    && defined($$_{name}))
				)} @{$opt{message}{alternates}}
		}
		elsif(defined($opt{message}{name})&&!is_ref($opt{message}{name})) { @{$self{msg}}=({name=>$opt{message}{name}}) }
	}
	elsif(is_arrayref($opt{message})) { @{$self{msg}}=grep {!is_ref($_) && defined($_)} @{$opt{message}} }
	elsif(!is_ref($opt{message}))     { @{$self{msg}}=grep {!is_ref($_) && defined($_)} $opt{message} }
	return bless(\%self,$class);
}

sub unwrap {
	my ($self,$msg)=@_;
	if(!defined($msg)) { return ('',$self) }
	my $names=$$self{names};
	if(!is_ref($msg))  {
		if(!defined($$names{$msg})) { return ($msg,$self) }
		return __PACKAGE__->new(%{$$names{$msg}},names=>{})->random();
	}
	if(is_hashref($msg)) {
		my $name=$$msg{name}//$$msg{message};
		if(!defined($$names{$name})) { return ($$msg{message},$msg) }
		return __PACKAGE__->new(%{$$names{$name}},names=>{})->random();
	}
	return ('',$msg);
}

sub primary { my ($self)=@_; return $self->unwrap($$self{msg}[0]) }
sub random  { my ($self)=@_; return $self->unwrap($$self{msg}[ int(rand(1+$#{$$self{msg}})) ]) }

sub attributesFromConf {
	my ($conf)=@_;
	if(!is_hashref($conf)) { return }
	my @res;
	if(is_hashref($$conf{attributes})) {
		while(my ($k,$v)=each %{$$conf{attributes}}) { push @res,[$k,$v] } }
	if(is_arrayref($$conf{alternates})) {
		foreach my $message (grep {is_hashref($_)} @{$$conf{alternates}}) {
			if(is_hashref($$message{attributes})) {
				while(my ($k,$v)=each %{$$message{attributes}}) { push @res,[$k,$v] } } } }
	return @res;
}



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