From: Peter Rabbitson Date: Fri, 30 Sep 2016 06:36:35 +0000 (+0200) Subject: Tighten up code in ResultSetColumns, add INDIRECT annotations X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c5340bfac7aff784999be6ab4fa803fd9440043f;p=dbsrgits%2FDBIx-Class.git Tighten up code in ResultSetColumns, add INDIRECT annotations No functional changes (nothing else in lib/ and t/ had to change) --- diff --git a/lib/DBIx/Class/ResultSetColumn.pm b/lib/DBIx/Class/ResultSetColumn.pm index 5b510de..bde5f9a 100644 --- a/lib/DBIx/Class/ResultSetColumn.pm +++ b/lib/DBIx/Class/ResultSetColumn.pm @@ -151,12 +151,10 @@ one value. =cut sub next { - my $self = shift; + #my $self = shift; # using cursor so we don't inflate anything - my ($row) = $self->_resultset->cursor->next; - - return $row; + ($_[0]->_resultset->cursor->next)[0]; } =head2 all @@ -178,10 +176,10 @@ than result objects. =cut sub all { - my $self = shift; + #my $self = shift; # using cursor so we don't inflate anything - return map { $_->[0] } $self->_resultset->cursor->all; + map { $_->[0] } $_[0]->_resultset->cursor->all; } =head2 reset @@ -202,9 +200,10 @@ Much like L. =cut sub reset { - my $self = shift; - $self->_resultset->cursor->reset; - return $self; + #my $self = shift; + + $_[0]->_resultset->reset; + $_[0]; } =head2 first @@ -224,14 +223,13 @@ Much like L but just returning the one value. =cut -sub first { - my $self = shift; +sub first :DBIC_method_is_indirect_sugar { + DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call; # using cursor so we don't inflate anything - $self->_resultset->cursor->reset; - my ($row) = $self->_resultset->cursor->next; - - return $row; + my $cursor = $_[0]->_resultset->cursor; + $cursor->reset; + ($cursor->next)[0]; } =head2 single @@ -251,14 +249,14 @@ is issued before discarding the cursor. =cut sub single { - my $self = shift; + #my $self = shift; - my $attrs = $self->_resultset->_resolved_attrs; - my ($row) = $self->_resultset->result_source->schema->storage->select_single( - $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs - ); + my $rs = $_[0]->_resultset; - return $row; + my $attrs = $rs->_resolved_attrs; + ($rs->result_source->schema->storage->select_single( + $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs + ))[0]; } =head2 min @@ -410,9 +408,11 @@ value. Produces the following SQL: =cut -sub func { - my ($self,$function) = @_; - my $cursor = $self->func_rs($function)->cursor; +sub func :DBIC_method_is_indirect_sugar{ + DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call; + + #my ($self,$function) = @_; + my $cursor = $_[0]->func_rs($_[1])->cursor; if( wantarray ) { DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_WANTARRAY and my $sog = fail_on_internal_wantarray; diff --git a/lib/DBIx/Class/_Util.pm b/lib/DBIx/Class/_Util.pm index 29b196d..73f41e9 100644 --- a/lib/DBIx/Class/_Util.pm +++ b/lib/DBIx/Class/_Util.pm @@ -1196,6 +1196,17 @@ sub fail_on_internal_call { $check_fr->[0] =~ /^(?:DBIx::Class|DBICx::)/ and $check_fr->[1] !~ /\b(?:CDBICompat|ResultSetProxy)\b/ # no point touching there + and + # one step higher + @fr2 = CORE::caller(@fr2 ? 3 : 2) + and + # if the frame that called us is an indirect itself - nothing to see here + ! grep + { $_ eq 'DBIC_method_is_indirect_sugar' } + do { + no strict 'refs'; + attributes::get( \&{ $fr2[3] }) + } ) { DBIx::Class::Exception->throw( sprintf ( "Illegal internal call of indirect proxy-method %s() with argument '%s': examine the last lines of the proxy method deparse below to determine what to call directly instead at %s on line %d\n\n%s\n\n Stacktrace starts",