Acme-RPC
view release on metacpan or search on metacpan
lib/Acme/RPC.pm view on Meta::CPAN
is causing confusion and grief.
Need a structure where for any given $node, $node->{chr(0)} is the (possible) object representing that node,
and $node->{everything else} is the stuff under it.
Then given a code ref, $node->{chr(0)} would be the code ref itself, and $node->{everything else} would be lexicals vars.
Given a stash like "foo::", $node->{chr(0)} would actually be \%{'foo::'} and $node->{everything else} would be stuff in that package.
* Rather than only taking oids to dump/call, also take a path in the tree.
* lazy=1 parameter where the last $tree is re-used rather than re-computed.
* Should switch to our own recurse logic from Data::Dumper to support these other things.
* action=dump on anything; in the case of a coderef, find its source on disc or else deparse it
* action=call on coderefs and blessed objects, with an args parameter, or arg1, arg2, arg3, etc, and a method parameter for blessed objs.
* json will croak if a reference contains objects in side it somewhere. Should handle this gracefully.
* Offer JSON output! Not just Data::Dumper. Do this for action=dump, action=call, and the default tree view.
* If Devel::Leak won't give us refs... have to do an Acme::State style crawl from main::,
lib/Acme/RPC.pm view on Meta::CPAN
sub reg ($) {
$registry{0+$_[0]} = $_[0];
}
sub tree {
# first, recurse through stashes starting with main::, then as we hit arrayrefs, hashrefs, and coderefs,
# recurse into those.
# XXX reworking this a bit. each node should contain things logically under it as well as a ref to the
# object that it logically refers to. items under it are $node{whatever}, and itself is $node{chr(0)} now.
# so, it follows that given $node{whatever}, $node{whatever}{chr(0)} is the reference for whatever.
# this way, all nodes are hashes with children and a seperated off reference to the target object.
# scalars can appear in packages, in object instance data, or in code refs. same for lots of things.
my $package = shift;
return sub {
# recurse through stashes (happens at the topmost level)
my $object = shift;
my $node = { };
no strict 'refs';
if(! ref($object) and $object =~ m/::$/) {
# I don't like how each scenario is replicated here, but each is pretty short, after the custom logic for dealing with the stash.
my $package = $object;
for my $k (keys %{$package}) {
next if $k =~ m/main::$/;
next if $k =~ m/[^\w:]/;
if($k =~ m/::$/) {
# found a package inside of a package
# my $modulepath = $package.$k;
# for($modulepath) { s{^main::}{}; s{::$}{}; s{::}{/}g; $_ .= '.pm'; }
$node->{$k} = caller_cv(0)->($package.$k);
reg( $node->{$k}{chr(0)} = \%{$package.$k} ); # have to do this after assinging in from the recursie call
lib/Acme/RPC.pm view on Meta::CPAN
sub tryunobject {
my $ob = shift;
my $request = shift;
if( blessed($ob) and UNIVERSAL::isa($ob, 'HASH') ) {
$ob = { %$ob };
} elsif( blessed($ob) and UNIVERSAL::isa($ob, 'ARRAY') ) {
$ob = [ @$ob ];
} elsif( blessed($ob) and UNIVERSAL::isa($ob, 'SCALAR') ) {
$ob = \ ${$ob};
} elsif( blessed($ob) ) {
$request->print("object not blessed hash, array or scalar... no logic for converting to JSON, sorry");
return;
}
return $ob;
}
END { $continuity->loop }
1;
( run in 0.532 second using v1.01-cache-2.11-cpan-cc502c75498 )