DBIx-QuickORM
view release on metacpan or search on metacpan
worktrees/dbic-compat-native-features/lib/DBIx/QuickORM/Row/Async.pm view on Meta::CPAN
package DBIx::QuickORM::Row::Async;
use strict;
use warnings;
our $VERSION = '0.000028';
use Carp();
use Scalar::Util();
use overload (
'bool' => sub { $_[0]->{invalid} ? 0 : 1 },
);
=pod
=encoding UTF-8
=head1 NAME
DBIx::QuickORM::Row::Async - Placeholder that swaps itself for a real row once async results arrive.
=head1 DESCRIPTION
A transparent proxy returned for an asynchronous single-row query. It holds an
async statement handle and, once results are ready, materializes the real row
and swaps itself out in place via the C<$_[0]> alias, so callers transparently
end up holding the real row object. Until then it forwards method calls,
C<isa>, C<can>, and C<DOES> to the eventual row's class. If the query returns
no data or is cancelled the proxy becomes invalid: boolean context is false
and method calls croak.
Construction requires an C<async> handle implementing
L<DBIx::QuickORM::Role::Async>. Optional C<auto_refresh> refreshes the row once
materialized; C<state_method> (default C<state_select_row>) and C<state_args>
control how the connection builds the row.
=head1 SYNOPSIS
my $row = $async_row; # placeholder, true while pending/valid
print $row->column; # swaps in the real row, then forwards
=head1 PUBLIC METHODS
=over 4
=item $bool = $row->isa($class)
True if the eventual row would satisfy the C<isa> check; swaps the proxy out
once results are ready.
=cut
sub isa {
my ($this, $check) = @_;
return 1 if $check eq __PACKAGE__;
return 1 if $check eq 'DBIx::QuickORM::Row';
return 1 if DBIx::QuickORM::Row->isa($check);
if (my $class = Scalar::Util::blessed($this)) {
if ($this->ready) {
my $a = $_[0];
$_[0] = $this->swapout;
return $_[0]->isa($check) unless Scalar::Util::refaddr($a) eq Scalar::Util::refaddr($_[0]);
}
return 1 if $check eq $class;
# Constructors do not reliably supply row_class; guard its use.
if (my $row_class = $this->{row_class}) {
return 1 if $check eq $row_class;
return 1 if $row_class->isa($check);
}
}
return 0;
}
=pod
=item $code = $row->can($method)
Forward C<can> to the eventual row's class; swaps the proxy out once results
are ready.
( run in 0.640 second using v1.01-cache-2.11-cpan-7fcb06a456a )