package Facade::Base; sub new { my $class = shift; my ($main) = @_; return bless \$main, $class; } package Facade::One; use base 'Facade::Base'; sub example { my $self = shift; # foo() is a method on the object I expect to facade over $$self->foo( @args ); } package main; my $datastructure = Main::Class->new( %params ); my $facade1 = Facade::One->new( $datastructure ); # Now, I can call Facade::One's methods on $facade1. # I can also change the facade by doing something like: my $facade2 = Facade::Two->new( $$facade1 );