use strict; use warnings; no warnings qw/once/; package Alter; my %data; sub ego { return( $data{scalar caller(0)} ||= {} ); } package Plugin; sub foo { $_[0]->ego()->{name} = $_[1] if @_ > 1; return $_[0]->ego()->{name}; } package MyClass; *ego = \&Alter::ego; *foo = \&Plugin::foo; sub bar { $_[0]->ego()->{name} = $_[1] if @_ > 1; return $_[0]->ego()->{name}; } package main; my $obj = bless( \my $scalar, "MyClass" ); $obj->bar( "Larry" ); $obj->foo( "Damian" ); for my $m ( qw/bar foo/ ) { print "$m: ", $obj->$m, "\n"; } #### bar: Larry foo: Damian