AnyEvent-Mac-Pasteboard
view release on metacpan or search on metacpan
lib/AnyEvent/Mac/Pasteboard.pm view on Meta::CPAN
package AnyEvent::Mac::Pasteboard;
use strict;
use warnings;
use 5.008;
our $VERSION = '0.03';
use AnyEvent;
use Mac::Pasteboard ();
use Scalar::Util qw(looks_like_number);
use Time::HiRes;
our $DEFAULT_INTERVAL = 5;
#my $NATURAL_NUMBER_RE = qr/^[1-9][0-9]*$/;
sub new {
my $class = shift;
my %args = @_;
my $on_change = delete $args{on_change} || sub { };
my $on_unchange = delete $args{on_unchange} || undef;
my $on_error = delete $args{on_error} || sub { die @_; };
my $interval = delete $args{interval} || $DEFAULT_INTERVAL;
my $multibyte = delete $args{multibyte} || 1; # 1 is TRUE
if ( !defined $interval
or (ref $interval eq 'ARRAY' && @$interval != grep { looks_like_number($_) && $_ > 0 } @$interval )
or (!ref $interval && !looks_like_number($interval) ) ) {
$on_error->(qq(argument "interval" is natural number or arrayref contained its.));
}
my @interval = ref $interval eq 'ARRAY' ? @$interval : ($interval);
my $interval_idx = 0;
my $self = bless {}, $class;
my ($previous_content, $current_content);
$previous_content = $current_content = $self->{content}
= Mac::Pasteboard::pbpaste() || ''; # initialize
$self->{multibyte} = $multibyte;
my $on_time_core = sub {
$current_content = $self->{content} = Mac::Pasteboard::pbpaste() || '';
if ( $previous_content ne $current_content ) {
$on_change->($self->pbpaste());
$previous_content = $current_content;
$interval_idx = 0;
}
elsif ( $on_unchange && ref $on_unchange eq 'CODE' ) {
$on_unchange->($self->pbpaste());
}
};
if ( @interval == 1 ) {
$self->{timer} = AE::timer 0, $interval[0], $on_time_core;
}
else {
my $on_time; $on_time = sub {
$on_time_core->();
my $wait_sec = $interval_idx < @interval ? $interval[$interval_idx++] : $interval[-1];
$self->{timer} = AE::timer $wait_sec, 0, $on_time;
};
### On first initial run, hidden "on_unchange" callback.
### $on_unchange is lexical, so we can not "local"ize it.
my $on_unchange_stash = $on_unchange;
$on_unchange = undef;
$on_time->();
$on_unchange = $on_unchange_stash;
}
return $self;
}
sub pbpaste {
my $self = shift;
return $self->{multibyte} ? scalar(`pbpaste`) : $self->{content};
}
1;
__END__
=pod
=head1 NAME
AnyEvent::Mac::Pasteboard - observation and hook pasteboard changing.
( run in 1.677 second using v1.01-cache-2.11-cpan-39bf76dae61 )