WWW-Workflowy
view release on metacpan or search on metacpan
lib/WWW/Workflowy.pm view on Meta::CPAN
Returns a coderef.
=head2 dump
Produces an ASCII representation of the outline tree.
=head2 find
Recurses through the entire outline tree, calling the callback for each item. The callback is passed the node currently being examined and an
arrayref of parents, top most parent first.
=head2 edit
Changes the text of a node.
=head2 create
Created a new node.
=head2 delete
Deletes a node.
=head2 move
No class method yet. The thing handles C<move> commands sent down by the L<Workflowy> server (when data was moved by another L<Workflowy> client) but doesn't
yet let you send that command to the server.
=head2 sync
C<sync> fetches changes other people have made to the current L<Workflowy> outline and attempts to merge them into the local outline.
C<create>, C<edit>, and C<delete> minipulate data locally but only queue it to later be sent to the L<Workflowy> server.
Executing a C<sync> causes pending operations to be sent.
B<Check the return value!> C<sync> returns B<false> and does nothing if C<< $wf->polling_interval >> seconds have not yet passed
since the last request to the F<Workflowy> server. Calling C<new> generally results in a request to the F<Workflowy> server.
To avoid C<sync> returning C<false> and doing nothing, use this idiom:
sleep $wf->polling_interval;
$wf->sync;
C<< $wf->last_poll_time >> contains a timestamp of the time that the last request was made.
The value for C<< $wf->polling_interval >> may change in response to a request to the server.
=head2 fetch
Fetches the latest copy of the outline from the L<Workflowy> server, blowing away any local changes made to it that haven't yet been pushed up.
This happens automatically on C<new>.
=head2 get_children
Takes a node id. Returns an arrayref of a node's children if it has children, or false otherwise.
=cut
package autobox::Closure::XAttributes::Methods;
use base 'autobox';
use B;
use PadWalker;
sub AUTOLOAD :lvalue {
my $code = shift;
(my $method = our $AUTOLOAD) =~ s/.*:://;
return if $method eq 'DESTROY';
# we want the scalar unless the method name already a sigil
my $attr = $method =~ /^[\$\@\%\&\*]/ ? $method : '$' . $method;
my $closed_over = PadWalker::closed_over($code);
# is there a method of that name in the package the coderef was created in?
# if so, run it.
# give methods priority over the variables we close over.
# XXX this isn't lvalue friendly, but sdw can't figure out how to make it be and not piss off old perls.
my $stash = B::svref_2object($code)->STASH->NAME;
if( $stash and $stash->can($method) ) {
# t/003-live-test.t .............. Can't modify non-lvalue subroutine call at lib/WWW/Workflowy.pm line 170. in perl 5.14.2
# goto apparently cheats lvalue detection; cheating detection is adequate for our purposes.
# return $stash->can($method)->( $code, @_ );
@_ = ( $code, @_ ); goto &{ $stash->can($method) };
}
exists $closed_over->{$attr} or Carp::croak "$code does not close over $attr";
my $ref = ref $closed_over->{$attr};
if (@_) {
return @{ $closed_over->{$attr} } = @_ if $ref eq 'ARRAY';
return %{ $closed_over->{$attr} } = @_ if $ref eq 'HASH';
return ${ $closed_over->{$attr} } = shift;
}
$ref eq 'HASH' || $ref eq 'ARRAY' ? $closed_over->{$attr} : ${ $closed_over->{$attr} }; # lvalue friendly return
}
#
#
#
package WWW::Workflowy;
use autobox CODE => 'autobox::Closure::XAttributes::Methods'; # XXX temp since we can't 'use' it because it's inline
sub import {
my $class = shift;
$class->autobox::import(CODE => 'autobox::Closure::XAttributes::Methods');
}
sub new {
my $package = shift;
my %args = @_;
#
my $outline;
my $client_id;
my $date_joined;
my $last_transaction_id; # transaction ids are much alrger than the lastModified/lm values; eg 106551357; comes from initialMostRecentOperationTransactionId then $result_json->{results}->[0]->{new_most_recent_operation_transaction_id}
my $operations = []; # edits we've made but not yet posted
my $polling_interval; # from $outline->{initialPollingIntervalInMs} and then ->{results}->[0]->{new_polling_interval_in_ms}
my $last_poll_time;
#
my $share_id; # stands in temporarily for shared_projectid for newer style URLs that look like https://workflowy.com/s/123abcdeABCDE
( run in 0.529 second using v1.01-cache-2.11-cpan-39bf76dae61 )