Sidef
view release on metacpan or search on metacpan
lib/Sidef/Object/Object.pm view on Meta::CPAN
@parents;
};
Sidef::Types::Array::Array->new([$extract_parents->(CORE::ref($obj) || $obj)]);
}
sub interpolate {
my $self = shift(@_);
$self->new(CORE::join('', @_));
}
sub dump {
my %addr; # keep track of dumped objects
my $sub = sub {
my ($obj) = @_;
my $refaddr = Scalar::Util::refaddr($obj);
exists($addr{$refaddr})
and return $addr{$refaddr};
my $type = Sidef::normalize_type(CORE::ref($obj) || $obj);
Scalar::Util::reftype($obj) eq 'HASH' or return $type;
my @keys = CORE::sort(CORE::keys(%{$obj}));
my $str = Sidef::Types::String::String->new($type . "(#`($refaddr)...)");
$addr{$refaddr} = $str;
my $s;
$$str = (
"$type(" . CORE::join(
', ',
map {
my $str = (
defined($obj->{$_})
? (
(CORE::ref($obj->{$_}) && ($s = UNIVERSAL::can($obj->{$_}, 'dump')))
? $s->($obj->{$_})
: "$obj->{$_}"
)
: 'nil'
);
"$_: $str";
} @keys
)
. ')'
);
$str;
};
no warnings 'redefine';
local *Sidef::Object::Object::dump = $sub;
$sub->($_[0]);
}
sub to_json {
my ($self) = @_;
state $x = require JSON;
Sidef::Types::String::String->new(scalar JSON::to_json($self->get_value));
}
{
no strict 'refs';
sub def_method {
my ($self, $name, $block) = @_;
*{(CORE::ref($self) || $self) . '::' . $name} = sub {
$block->call(@_);
};
$self;
}
sub undef_method {
my ($self, $name) = @_;
delete ${(CORE::ref($self) || $self) . '::'}{$name};
$self;
}
sub alias_method {
my ($self, $old, $new) = @_;
my $ref = (CORE::ref($self) || $self);
my $to = \&{$ref . '::' . $old};
if (not defined &$to) {
die "[ERROR] Can't alias the nonexistent method `$old` as `$new`!";
}
*{$ref . '::' . $new} = $to;
}
sub methods {
my ($self, @args) = @_;
my %alias;
my %methods;
my $ref = CORE::ref($self) || $self;
foreach my $method (grep { $_ !~ /^[(_]/ and defined(&{$ref . '::' . $_}) } keys %{$ref . '::'}) {
$methods{$method} = (
$alias{\&{$ref . '::' . $method}} //=
Sidef::Object::LazyMethod->new(
{
obj => $self,
method => $method,
args => \@args,
}
)
);
}
Sidef::Types::Hash::Hash->new(\%methods);
}
# Smart match operator
sub smartmatch {
my ($first, $second) = @_;
( run in 1.123 second using v1.01-cache-2.11-cpan-39bf76dae61 )