Badger
view release on metacpan or search on metacpan
lib/Badger/Utils.pm view on Meta::CPAN
my $helper = $DELEGATES->{ $symbol } || return 0;
require $helper->[FILE] unless $helper->[LOADED];
$class->export_symbol($target, $symbol, \&{ $helper->[CLASS].PKG.$symbol });
return 1;
}
sub _expand_helpers {
# invert { x => 'a b c' } into { a => 'x', b => 'x', c => 'x' }
my $helpers = shift;
return {
map {
my $name = $_; # e.g. Scalar::Util
my $file = module_file($name); # e.g. Scalar/Util.pm
map { $_ => [$name, $file, 0] } # third item is loaded flag
split(DELIMITER, $helpers->{ $name })
}
keys %$helpers
}
}
sub is_object($$) {
blessed $_[1] && $_[1]->isa($_[0]);
}
sub textlike($) {
! ref $_[0] # check if $[0] is a non-reference
|| blessed $_[0] # or an object with an overloaded
&& overload::Method($_[0], '""'); # '""' stringification operator
}
sub truelike($) {
falselike($_[0]) ? FALSE : TRUE;
}
sub falselike($) {
(! $_[0] || $_[0] =~ /^(0|off|no|none|false)$/i) ? TRUE : FALSE;
}
sub params {
# enable $DEBUG to track down calls to params() that pass an odd number
# of arguments, typically when the rhs argument returns an empty list,
# e.g. $obj->foo( x => this_returns_empty_list() )
my @args = @_;
local $SIG{__WARN__} = sub {
odd_params(@args);
} if DEBUG;
@_ && ref $_[0] eq HASH ? shift : { @_ };
}
sub self_params {
my @args = @_;
local $SIG{__WARN__} = sub {
odd_params(@args);
} if DEBUG;
(shift, @_ && ref $_[0] eq HASH ? shift : { @_ });
}
sub odd_params {
my $method = (caller(2))[3];
$WARN->(
"$method() called with an odd number of arguments: ",
join(', ', map { defined $_ ? $_ : '<undef>' } @_),
"\n"
);
my $i = 3;
while (1) {
my @info = caller($i);
last unless @info;
my ($pkg, $file, $line, $sub) = @info;
$WARN->(
sprintf(
"%4s: Called from %s in %s at line %s\n",
'#' . ($i++ - 2), $sub, $file, $line
)
);
}
}
sub module_file {
my $file = shift;
$file =~ s[::][/]g;
$file .= '.pm';
}
sub xprintf {
my $format = shift;
my @args = @_;
$format =~
s{ < (\d+)
(?: :( [#\-\+ ]? [\w\.]+ ) )?
(?: \| (.*?) )?
>
}
{ defined $3
? _xprintf_ifdef(\@args, $1, $2, $3)
: '%' . $1 . '$' . ($2 || 's')
}egx;
no if $] > 5.021, warnings => "redundant";
sprintf($format, @_);
}
sub _xprintf_ifdef {
my ($args, $n, $format, $text) = @_;
if (defined $args->[$n-1]) {
$format = 's' unless defined $format;
$format = '%' . $n . '$' . $format;
$text =~ s/\?/$format/g;
return $text;
}
else {
return '';
}
}
sub dotid {
my $text = shift; # munge $text to canonical lower case and dotted form
$text =~ s/\W+/./g; # e.g. Foo::Bar ==> Foo.Bar
return lc $text; # e.g. Foo.Bar ==> foo.bar
}
sub camel_case {
join(
BLANK,
map {
map { ucfirst $_ }
split '_'
( run in 1.829 second using v1.01-cache-2.11-cpan-99c4e6809bf )