Log-Report
view release on metacpan or search on metacpan
lib/Log/Report/Message.pm view on Meta::CPAN
'&{}' => sub { my $obj = shift; sub{$obj->clone(@_)} },
'.' => 'concat',
fallback => 1;
#--------------------
sub new($@)
{ my ($class, %s) = @_;
if(ref $s{_count})
{ my $c = $s{_count};
$s{_count} = ref $c eq 'ARRAY' ? @$c : keys %$c;
}
$s{_join} //= $";
if($s{_msgid})
{ $s{_append} = defined $s{_append} ? $1.$s{_append} : $1
if $s{_msgid} =~ s/(\s+)$//s;
$s{_prepend}.= $1
if $s{_msgid} =~ s/^(\s+)//s;
}
if($s{_plural})
{ s/\s+$//, s/^\s+// for $s{_plural};
}
my $tags = delete $s{_tag} // delete $s{_tags} // delete $s{_class} // delete $s{_classes};
$s{_tags} = ref $tags eq 'ARRAY' ? $tags : [ split /[,\s]+/, $tags ] if defined $tags;
bless \%s, $class;
}
# internal use only: to simplify __*p* functions
sub _msgctxt($) { $_[0]->{_msgctxt} = $_[1]; $_[0] }
sub clone(@)
{ my $self = shift;
(ref $self)->new(%$self, @_);
}
#--------------------
sub prepend() { $_[0]->{_prepend}}
sub msgid() { $_[0]->{_msgid} }
sub append() { $_[0]->{_append} }
sub domain() { $_[0]->{_domain} }
sub count() { $_[0]->{_count} }
sub context() { $_[0]->{_context}}
sub msgctxt() { $_[0]->{_msgctxt}}
sub tags() { @{$_[0]->{_tags} || []} }
*classes = \&tags;
sub addTags() { push @{shift->{_tags}}, @_ }
sub to(;$)
{ my $self = shift;
@_ ? $self->{_to} = shift : $self->{_to};
}
sub errno(;$)
{ my $self = shift;
@_ ? $self->{_errno} = shift : $self->{_errno};
}
sub valueOf($) { $_[0]->{$_[1]} }
#--------------------
sub taggedWith($)
{ my ($self, $match) = @_;
ref $match eq 'Regexp' ? (first { $_ =~ $$match } $self->tags) : (first { $_ eq $match } $self->tags);
}
*inClass = \&taggedWith;
sub toString(;$)
{ my ($self, $locale) = @_;
my $count = $self->{_count} || 0;
$locale = $self->{_lang} if $self->{_lang};
my $prepend = $self->{_prepend} // '';
my $append = $self->{_append} // '';
$prepend = $prepend->isa(__PACKAGE__) ? $prepend->toString($locale) : "$prepend"
if blessed $prepend;
$append = $append->isa(__PACKAGE__) ? $append->toString($locale) : "$append"
if blessed $append;
$self->{_msgid} # no translation, constant string
or return "$prepend$append";
# assumed is that switching locales is expensive
my $oldloc = setlocale(LC_MESSAGES);
setlocale(LC_MESSAGES, $locale)
if defined $locale && (!defined $oldloc || $locale ne $oldloc);
# translate the msgid
my $domain = $self->{_domain};
blessed $domain && $domain->isa('Log::Report::Minimal::Domain')
or $domain = $self->{_domain} = textdomain $domain;
my $format = $domain->translate($self, $locale || $oldloc)
// return ();
# fill-in the fields
my $text = $self->{_expand} ? $domain->interpolate($format, $self) : "$prepend$format$append";
setlocale(LC_MESSAGES, $oldloc)
if defined $oldloc && (!defined $locale || $oldloc ne $locale);
( run in 0.513 second using v1.01-cache-2.11-cpan-524268b4103 )