#!/usr/bin/perl package MyClass; use strict; use warnings; use Want; sub new { my $class = shift; return bless {last_op => ''}, $class; } sub this { my $self = shift; if (@_) { $self->{this} = $_[0]; } if ( my $op = $self->{last_op} ) { $self->$op($self->{this}); } else { $self->{curr_value} = $self->{this}; } return want(qw(SCALAR REF)) ? $self : $self->{curr_value}; } sub that { my $self = shift; if (@_) { $self->{that} = $_[0]; } if ( my $op = $self->{last_op} ) { $self->$op($self->{that}); } else { $self->{curr_value} = $self->{that}; } return want(qw(SCALAR REF)) ? $self : $self->{curr_value}; } sub andand { my $self = shift; $self->{last_op} = '_andand'; return $self; } sub _andand { my ($self, $value) = @_; $self->{last_op} = ''; $self->{curr_value} = $self->{curr_value} && $value; } package main; use strict; use warnings; my $foo = MyClass->new(); $foo->this(0); $foo->that(5); print "This: ", $foo->this(), "\n"; print "That: ", $foo->that(), "\n"; my $value = $foo->this()->andand->that(); print "V: $value\n"; $value = $foo->that()->andand->this(); print "V: $value\n"; $foo->this(3); $value = $foo->this()->andand->that(); print "V: $value\n"; $value = $foo->that()->andand->this(); print "V: $value\n";