By exposing the 'items' attribute via a method, you are telling users of the class that they can use it like this:
6:06% reply -I .
0> use fQ_moonimal;
1> my $q = fQ_moonimal->new(size => 3);
$res[0] = bless( {
'items' => [],
'size' => 3
}, 'fQ_moonimal' )
2> $q->push(2);
$res[1] = ''
3> $q->push(3);
$res[2] = ''
4> $q->push(5);
$res[3] = ''
5> $q
$res[4] = bless( {
'items' => [
2,
3,
5
],
'size' => 3
}, 'fQ_moonimal' )
6> push @{ $q->items }, 7, 11, 13;
$res[5] = 6
7> $q
$res[6] = bless( {
'items' => [
2,
3,
5,
7,
11,
13
],
'size' => 3
}, 'fQ_moonimal' )
8>
So this version of the queue is not really fixed size.
Encapsulation is one of the main motivations for doing OOP in the first place, and giving it up to get feature $X doesn't amount to superior OOP.