package Audio::XMMSClient::Sync; use strict; use warnings; use Audio::XMMSClient; use Scalar::Util qw/blessed/; sub new { my $base = shift; my $c = Audio::XMMSClient->new( @_ ); return $base->new_from( $c ); } sub new_from { my ($base, $c) = @_; my $self = bless \$c, $base; return $self; } sub can { my $self = shift; if (blessed $self) { my $code = $$self->can(@_); return $code if $code; } return $self->UNIVERSAL::can(@_); } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; (my $func = $AUTOLOAD) =~ s/.*:://; return if $func eq 'DESTROY'; unless ($$self->can($func)) { require Carp; Carp::croak (qq{Can't locate object method "$func" via package Audio::XMMSClient::Sync}); } { no strict 'refs'; *$AUTOLOAD = sub { shift->sync_request( $func, @_ ) }; &$AUTOLOAD; } } sub sync_request { my $self = shift; my $request = shift; my $resp = $$self->$request(@_); return $resp unless blessed $resp; if ($resp->isa('Audio::XMMSClient::Result')) { $resp->wait; if ($resp->iserror) { require Carp; Carp::croak ($resp->get_error); } return $resp->value; } if ($resp->isa('Audio::XMMSClient::Playlist')) { return Audio::XMMSClient::Playlist::Sync->new_from($resp); } return $resp; } package Audio::XMMSClient::Playlist::Sync; use strict; use warnings; use base qw/Audio::XMMSClient::Sync/; 1;